1.情景展示

gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案(gson将实体类转json)_实体类

如上图所示,使用谷歌的Gson将实体类转json字符串,如果实体类的属性值,出现大于号、小于号、等号等符号时,调用GsonBuilder进行转换时,这些符号会被强制转换成unicode编码。

如何解决这个问题?

2.原因分析

错误方式一:使用replaceAll()

gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案(gson将实体类转json)_json字符串_02

错误方式二:使用iso-8859-1解码

gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案(gson将实体类转json)_json字符串_03

3.解决方案

方式一:使用js解码

// 实例化对象并赋值
Result result = new Result().setCode("200").setFormat("PDF").setMessage("<Name>Mary=don</Name>");
// 实体类转json字符串
String gsonStr = new GsonBuilder().create().toJson(result);
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
String unUrl = "";
try {
unUrl = (String)engine.eval("unescape('"+gsonStr+"')");
System.out.println(unUrl);
} catch (ScriptException e) {
e.printStackTrace();
}

gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案(gson将实体类转json)_赋值_04

虽然这种方式可以实现解码,但不推荐使用。

方式二:禁用html编码(推荐使用)

// 实例化对象并赋值
Result result = new Result().setCode("200").setFormat("PDF").setMessage("<Name>Mary=don</Name>");
// 实体类转json字符串(禁止编码)
String gsonStr = new GsonBuilder().disableHtmlEscaping().create().toJson(result);
System.out.println(gsonStr);

gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案(gson将实体类转json)_赋值_04

方式三:转json对象

// 实例化对象并赋值
Result result = new Result().setCode("200").setFormat("PDF").setMessage("<Name>Mary=don</Name>");
// 实体类转json字符串
String gsonStr = new GsonBuilder().create().toJson(result);
com.alibaba.fastjson.JSONObject aliJSON = JSONObject.parseObject(gsonStr);
System.out.println(aliJSON);

gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案(gson将实体类转json)_实体类_06

注意:必须使用阿里的json,不能使用net的json。

netJson执行结果如下:

gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案(gson将实体类转json)_JAVAUTILS_07

4.拓展

使用Gson将实体类转json字符串,其实有两种方式。

除了使用GsonBuilder外,还可以使用Gson实现

gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案(gson将实体类转json)_json字符串_08

使用这种方式,也同样存在着被乱编码的情况。

使用GsonBuilder转json,还有一个功能就是:可以格式化json字符串。

我们知道,在Java中,不管是json对象还是字符串,打印到控制台上的数据,始终只显示在一行上,无法进行格式化。

// 实例化对象并赋值
Result result = new Result().setCode("200").setFormat("PDF").setMessage("<Name>Mary=don</Name>");
GsonBuilder gsonBuilder = new GsonBuilder();
// 美化输出(这里是格式化的关键)
gsonBuilder.setPrettyPrinting();
// 实体类转json字符串(禁止编码)
String gsonStr = gsonBuilder.disableHtmlEscaping().create().toJson(result);
System.out.println(gsonStr);

gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案(gson将实体类转json)_赋值_09


这样,在实际开发调试过程中,当控制台出现一大坨json字符串时,我们再也不用将其单独复制出来,再格式化进行查看啦。

综上所述,使用GsonBuilder比Gson功能更加强大。

另外,使用谷歌的Gson转json字符串还有一个好处就是:不用担心当属性名称不是标准的驼峰命名法(比如上面:首字母是大写)时,转换出来的key名称和属性名称不完全一致的问题。

2020-12-23

当想对json字符串进行格式化时,需要先将json字符串转json对象,再用GsonBuilder进行格式化。

gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案(gson将实体类转json)_赋值_10

写在最后

哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

作者:​​Marydon



python3 raise python3 raise用法

raise表示会抛出异常那么就是说raise会向python的解释器一个响应告诉解释器他的后面是一个异常让我们的程序中断一般是和自定义的异常连用。class CustomError(Exception):   def __init__(self): def main(): try :   s=input("请输入字符串:")   if len(s)<

java 私钥加密证书 java使用rsa公钥私钥加密解密

rsa秘钥必须是公钥和私钥一起使用,若用公钥机密,就得用私钥解密;若用私钥加密,就得用公钥解密创建主函数测试public static void main(String[] args) throws Exception { String data = "跳梁小豆tlxd666"; //秘钥(公钥+私钥)生成器