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名稱和屬性名稱不完全一致的問題。
2020-12-23
當想對json字符串進行格式化時,需要先將json字符串轉json對象,再用GsonBuilder進行格式化。

