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 類型?
通過上面的介紹有兩個關鍵點:
- JSON 是基於 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集
- 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的解析器)解析的時候,就要當心數值是不是超出了安全數的范圍。如果超出,這里推薦使用字符串類型來代替數值類型。