关于json反序列化字符串为java对象时科学计数法和精度问题
时间:2015-08-05 01:16:13
收藏:0
阅读:8902
公司自己开发了一套SIA服务,将消息传递和webservice服务都封装在里面,实现了各项目间通信的简化和消息保存不丢失。其中通过json字符串发送报文,然后把字符串转化为java对象的方式,进行各项目间的通信。
我们的项目用这种方式大概半年了,偶然发现一bug,为了解决这个bug又导致了另一个bug的出现。下面分别说一下两个bug,前一个并未具体找原因,应该也是底层实现的问题。
1、用jsonplugin-0.32.jar的JSONUtil.deserialize(str),这个jar中实现的deserialize(str)当我们的报文中传的数字类型的值(金额--有小数),且报文中的数字没有用字符串的形式,数字在各系统间传递时可能会变为科学计数法,此时如果用这个jar直接:
Map<String, Object> dataMap =(Map<String,Object>)JSONUtil.deserialize(msg)
则会报错
问题具体原因未查,现象也比较特殊,比如我输入2000000.00则报文会变为科学计数法,而我输入2000000.12或者2000000.1这样则不会变为科学计数法,这也是以前一直没有发现该问题的原因。
修复该bug办法:因为很多地方这样用的,所以报文形式不便改,只好换个jar啦。
2、使用json-lib-2.4-jdk15.jar,又遇到了新的问题,精度丢失了,这个比较好解决啦。
把jar源码搞出来,发现是数字类型的都转为number了,而不是BigDecimal,就把这里改为createBigDecimal了
评论(0)