為什么json 不能使用 int64類型


json 簡介

jsON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 易於人閱讀和編寫。同時也易於機器解析和生成。 它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集 。 JSON采用完全獨立於語言的文本格式,但是也使用了類似於 C語言 家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使 JSON 成為理想的數據交換語言。

JSON支持兩種數據結構存在:

  • 對象(object):一個對象包含一系列非排序的名稱/值對(pair),一個對象以{開始,並以}結束。每個名稱/值對之間使用 : 分割。
  • 數組 (array):一個數組是一個值(value)的集合,一個數組以 [ 開始,並以]結束。數組成員之間使用 , 分割。 具體的格式如下:
[value1, value2, value3]
  • 名稱/值(pair):名稱和值之間使用 : 隔開,格式如下:
{name:value}

名稱必須是字符串類型; 值(value)必須是可以是字符串(string),數值(number),對象(object),有序列表(array),或者 false, null, true 的其中一種。

JSON的格式描述可以參考RFC 4627。

資源搜索網站大全 https://www.renrenfan.com.cn

為什么JSON不支持 int64 類型?

通過上面的介紹有兩個關鍵點:

  1. JSON 是基於 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集
  2. JSON 支持number 類型

Javascript的數字存儲使用了IEEE 754中規定的雙精度浮點數數據類型,而這一數據類型能夠安全存儲 -(2^53-1) 到 2^53-1 之間的數值(包含邊界值)。JSON 是 Javascript 的一個子集,所以它也遵守這個規則。

以下是rfc7159的說明:

Note that when such software is used, numbers that are integers and are in the range [-(2^53)+1, (2^53)-1] are interoperable in the sense that implementations will agree exactly on their numeric values.

這兩個邊界值可以通過 JavaScript 的 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 獲取。

安全存儲的意思是指能夠准確區分兩個不相同的值,比如,253 - 1 是一個安全整數,它能被精確表示,在任何 IEEE-754 舍入模式(rounding mode)下,沒有其他整數舍入結果為該整數。作為對比,253 就不是一個安全整數,它能夠使用 IEEE-754 表示,但是 253 + 1 不能使用 IEEE-754 直接表示,在就近舍入(round-to-nearest)和向零舍入中,會被舍入為 253。 Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 將得到 true的結果,而這在數學上是錯誤的。 同樣 105308320612483198 === 105308320612483200 結果也是true

int64 類型的數值范圍是 -(2^63-1) 到 2^63-1。使用int64 類型json 對於超出范圍的數字,會出現解析錯誤的情況。

一個建議:對於大數字來說,使用str 是一個好的選擇。或者用類似這樣的結構:

{"int": 105308320612483198, "int_str": "105308320612483198"}

在json 中使用的時候 使用 int_str 屬性。

 

python 對json 的處理

python 中 int 類型值遠遠超過IEEE 754 中定義的雙精度值的范圍,所以對於在 python 中使用的json數據,可以使用放心使用 int64 類型(python中的long )。但是如果序列化后的數據要被其它語言的解析器(比如:JavaScript的解析器)解析的時候,就要當心數值是不是超出了安全數的范圍。如果超出,這里推薦使用字符串類型來代替數值類型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM