关于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
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!