背景
在超职季活动中需要给前端下发各个任务的跳转链接,发现返回的url种包含一些unicode编码。 因为数据是通过http接口返回的,猜想可能是字符编码导致的,于是手动将http response的header 设置成了
content-type: aplication/json;charset=UTF-8发现没用,于是查日志发现打印的日志也是包含这种unicode编码的,于是debug了一下发现从配置中心拿到的数据并没有包含特殊编码。 排查发现是gson框架在序列化json的时候会将一部分特殊编码做替换
解决
要解决这个问题也比较简单,在创建gson对象的时候指定不替换着部分字符就行,代码如下
new GsonBuilder().disableHtmlEscaping().create().toJson(new Aa("test====="))
但是,序列化json的代码是写在jar中的,陈年老代码不太好改,这里直接替换了一种json序列化方式解决了。
常用json框架处理特殊字符
分别对Jackson、Fastjson、gson对比
System.out.println("Jackson: " + new ObjectMapper().writeValueAsString(new Aa("test=====")));
System.out.println("Fastjson: "+ JSON.toJSONString(new Aa("test=====")));
System.out.println("gson: " + new Gson().toJson(new Aa("test=====")));
System.out.println("gson: " + new GsonBuilder().disableHtmlEscaping().create().toJson(new Aa("test=====")));
运行结果如下,只有gson做了这部分处理,手动指定之后就不会替换了
Jackson: {"name":"test====="}
Fastjson: {"name":"test====="}
gson: {"name":"test\u003d\u003d\u003d\u003d\u003d"}
gson: {"name":"test====="}
追下源码
gson在将对象序列化成json字符串的时候做的替换,
代码位置
com.google.gson.stream.JsonWriter#string