javascript
javascript json_JavaScript 之 JSON.parse 导致大数精度丢失问题的解决方案
問題復現
前端向服務端請求某個訂單數據,其中訂單號 18 位,在數據庫中以數字的形式保存,服務端查詢數據庫后向前端返回如下數據:
{code: 0,message: 'success',data: {uid: 10001,productId: 100003,orderId: 179828993786548789} }前端調用接口后,通過 http 傳輸的數據并不是 JSON,而是 JSON 字符串:
"{"code":0,"message":"success","data":{"uid":10001,"productId":100003,"orde rId":179828993786548789}}"由于在各大 HTTP 請求庫的內部,實現了對application/json 等各種類型返回數據的格式化,也就是調用JSON.parse來對請求過來的數據進行處理,因此,前端通過這些調用獲取到的數據已經是被格式化了,得到了如下數據:
{code: 0,message: 'success',data: {uid: 10001,productId: 100003,orderId: 179828993786548800} }很明顯可以看到,orderId變化了,就是由于精度問題。
如何解決
其實最簡單的解決方案,也是大家一下子就能想到的,就是讓服務端把訂單號以字符串的形式返回回來。這是最簡單最便捷的解決方式。
我們這里僅針對這個問題來解決問題,從自身出發尋找解決方案。
無論是 fetch 還是 axios 等各種 HTTP 庫,都提供了類似于 formatResponseData 的方法,可以自己傳入格式化的方法而不是使用默認的 JSON.parse。問題的解決入口就在于此。
方案一(不推薦)
在formatResponseData中,找到對應的字段,并將其值改為字符串,再使用JSON.parse方法來格式化。
為什么不推薦呢?不通用,僅針對當前業務解決問題。
方案二 (推薦)
使用 json-bigint 處理返回值。
json-bigint 提供了幾個示例,為了徹底解決,將大數轉換為字符串是比較保險的方案,因此推薦下面這個方案:
Input:
var JSONbigString = require('json-bigint')({"storeAsString": true}); var key = '{ "key": 1234567890123456789 }'; console.log('nnStoring the BigInt as a string, instead of a BigNumber'); var withString = JSONbigString.parse(key); console.log('Input:', withString)Output:
Storing the BigInt as a string, instead of a BigNumber Input: { "key": "1234567890123456789" }總結
如果服務端能良心一點,就不會返回超精度類型的數據給前端,我恨!
歡迎關注同名微信公眾號:「WeCode365」總結
以上是生活随笔為你收集整理的javascript json_JavaScript 之 JSON.parse 导致大数精度丢失问题的解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 离散傅里叶变换python_使用pyth
- 下一篇: hash hashcode变化_没想到