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進行格式化。