1.情景展示
如上图所示,使用谷歌的Gson将实体类转json字符串,如果实体类的属性值,出现大于号、小于号、等号等符号时,调用GsonBuilder进行转换时,这些符号会被强制转换成unicode编码。
如何解决这个问题?
2.原因分析
错误方式一:使用replaceAll()
错误方式二:使用iso-8859-1解码
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(); }
虽然这种方式可以实现解码,但不推荐使用。
方式二:禁用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);
方式三:转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);
注意:必须使用阿里的json,不能使用net的json。
netJson执行结果如下:
4.拓展
使用Gson将实体类转json字符串,其实有两种方式。
除了使用GsonBuilder外,还可以使用Gson实现
使用这种方式,也同样存在着被乱编码的情况。
使用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);
这样,在实际开发调试过程中,当控制台出现一大坨json字符串时,我们再也不用将其单独复制出来,再格式化进行查看啦。
综上所述,使用GsonBuilder比Gson功能更加强大。
另外,使用谷歌的Gson转json字符串还有一个好处就是:不用担心当属性名称不是标准的驼峰命名法(比如上面:首字母是大写)时,转换出来的key名称和属性名称不完全一致的问题。