2012-08-31 110 views
3

可能重複:
Large numbers erroneously rounded in Javascriptwindow.parseJSON被截斷大量

我使用jQuery.parseJSON()取一個JSON字符串,使它的對象。 json字符串放置在我們的服務器的腳本標記中,並帶有初始標記。 json字符串包含引用我們網站上不同資源的值。

在開發過程中忽略了這個問題,並且現在開始重新開始。我們的服務器是基於Java的。數字值大部分表示爲長整數。所以json字符串將會有「...'id':25783071737028608 ...」。這是一個問題,因爲這個值超過了JS Number類型的最大值的兩倍,即10的整數。在這種情況下,數字被取整爲:25783071737028610,這會導致各種數據不一致問題。

這種類型的模式在我們的網站上無處不在,數值代表我們數據庫中的值。我想避免對數據庫進行大規模的重構。我也希望避免僅僅通過字符串(「...'id':」25783071737028608「...」)傳遞給瀏覽器的東西,因爲找到每個傳入javascript的長整型實例都需要對數據庫進行大規模的重構。

反正是有代表在JavaScript中一個Java long類型嗎?如果沒有(我認爲是這樣)有沒有,你可能已經習慣瞭解決類似問題的任何創造性的工作變通?

回答

4

正如您已經提到的那樣,您的值超過了JavaScript中的最大整數值,所以除了將值作爲字符串傳遞或編寫自己的JavaScript JSON解析器(或修改jQuery之一)並將長整型值解析爲字符串。

+1

這是一個無賴。 – aamiri

0

你必須在服務器上將數字編碼爲字符串,否則在JavaScript中編寫自己的JSON解析器來處理太大的數字常量。 )

編輯 —對不起,我錯過了你說你無法改變編碼的部分。 好消息是,您應該能夠使用JSON2解析器源並對其進行修改,或許將所有數字常量解釋爲字符串,或者將長度超過一定數量的數字解釋爲字符串。

糟糕的是,json2.js「解析器」只是一個消毒劑,確保調用eval()不會導致問題。那麼,我認爲這種方法是你唯一的選擇。如果您的JSON表達式的結構經常且足夠簡單,那麼您可以使用正則表達式對它們進行「解析」,但是如果沒有,那麼JavaScript中的JSON解析器就是這樣。

-1

JavaScript中的數字是雙精度浮點數,這意味着它們具有大約15位的精度。與1/3相同的方式近似得出15位以上的數字。

即使您可以將其更改爲字符串,也無法以任何方式處理該號碼。老實說,我想不出有什麼理由讓你有四分位身份證號碼...

+0

你在這裏說的沒有什麼是有幫助的。 – aamiri

+0

那麼你沒有完全放棄繼續。爲什麼你有25個quadrillion作爲ID號碼?你真的有25萬億元元素來識別嗎? –

+0

@Kolink他說他們是數據庫密鑰,所以也許它是某種64位編碼的各種單獨的概念領域。 – Pointy