關於json還原序列化字串為java對象時科學計數法和精度問題

來源:互聯網
上載者:User

標籤: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對象時科學計數法和精度問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.