標籤:json 科學計數法 精度丟失
公司自己開發了一套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)
則會報錯
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/70/E7/wKiom1XAqcHzy0TMAATtPObxBog225.jpg" title="報錯資訊.png" alt="wKiom1XAqcHzy0TMAATtPObxBog225.jpg" />問題具體原因未查,現象也比較特殊,比如我輸入2000000.00則報文會變為科學計數法,而我輸入2000000.12或者2000000.1這樣則不會變為科學計數法,這也是以前一直沒有發現該問題的原因。
修複該bug辦法:因為很多地方這樣用的,所以報文形式不便改,只好換個jar啦。
2、使用json-lib-2.4-jdk15.jar,又遇到了新的問題,精度丟失了,這個比較好解決啦。
把jar源碼搞出來,發現是數字類型的都轉為number了,而不是BigDecimal,就把這裡改為createBigDecimal了
關於json還原序列化字串為java對象時科學計數法和精度問題