最近线上项目出现了gc异常(下篇详细介绍),后来知道fastjson存在漏洞,项目用的是旧的版本1.1.45版本,为了增加安全性,对fastjson进行了版本升级。结果出现更多的问题,客户端阅读器所有接口几乎全部挂掉。
自己app的客户端没有影响,但是一部分阅读器接口对json无法解析,查看原因,是因为fastjson版本升级到了1.2.28,而新的版本有新的特性。
1 、接口参数结构不变的情况下,参数的位置改变,app端解析json是正规的解析方式,而阅读器端解析json采用的正则表达式解析,这样就灾难了。
2 、新版本的fastjson对double float 类型精度处理和旧版本不一致。
代码如下
JSONObject jsonObject = new JSONObject(); Double dou = new Double(5.0); jsonObject.put("dou",dou); System.out.println(JSON.toJSONString(jsonObject));
旧版本输出{"dou",5},因为结尾的.0 被截掉了,而新版本更加正式了,会输出{"dou",5.0},但对于阅读器采用正则表达式截取字段,就会出问题。
综上
客户端最好把全部关于业务逻辑的部分放到服务端,以便能扩展和修改。客户端一旦发版后,有些东西就写死了,所以客户端在做的时候也要想到兼容性问题。对于某些返回值的解析,如论是json还是xml,最好使用标准的方式解析,不要用正则表达式解析,太不灵活了。
原文链接:https://www.f2er.com/json/288948.html