int64 java_为什么json 不能使用 int64类型
json 簡介
jsON(JavaScript?Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。 易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。?它基于JavaScript?Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個(gè)子集?。 JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于 C語言?家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使 JSON?成為理想的數(shù)據(jù)交換語言。
JSON支持兩種數(shù)據(jù)結(jié)構(gòu)存在:
對(duì)象(object):一個(gè)對(duì)象包含一系列非排序的名稱/值對(duì)(pair),一個(gè)對(duì)象以{開始,并以}結(jié)束。每個(gè)名稱/值對(duì)之間使用?:?分割。
數(shù)組 (array):一個(gè)數(shù)組是一個(gè)值(value)的集合,一個(gè)數(shù)組以?[?開始,并以]結(jié)束。數(shù)組成員之間使用?,?分割。 具體的格式如下:
[value1, value2, value3]
名稱/值(pair):名稱和值之間使用?:?隔開,格式如下:
{name:value}
名稱必須是字符串類型; 值(value)必須是可以是字符串(string),數(shù)值(number),對(duì)象(object),有序列表(array),或者 false, null, true 的其中一種。
JSON的格式描述可以參考RFC 4627。
資源搜索網(wǎng)站大全 https://www.renrenfan.com.cn
為什么JSON不支持 int64 類型?
通過上面的介紹有兩個(gè)關(guān)鍵點(diǎn):
JSON 是基于 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個(gè)子集
JSON 支持number 類型
Javascript的數(shù)字存儲(chǔ)使用了IEEE 754中規(guī)定的雙精度浮點(diǎn)數(shù)數(shù)據(jù)類型,而這一數(shù)據(jù)類型能夠安全存儲(chǔ) -(2^53-1) 到 2^53-1 之間的數(shù)值(包含邊界值)。JSON 是 Javascript 的一個(gè)子集,所以它也遵守這個(gè)規(guī)則。
以下是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.
這兩個(gè)邊界值可以通過 JavaScript 的 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 獲取。
安全存儲(chǔ)的意思是指能夠準(zhǔn)確區(qū)分兩個(gè)不相同的值,比如,253 - 1 是一個(gè)安全整數(shù),它能被精確表示,在任何 IEEE-754 舍入模式(rounding mode)下,沒有其他整數(shù)舍入結(jié)果為該整數(shù)。作為對(duì)比,253 就不是一個(gè)安全整數(shù),它能夠使用 IEEE-754 表示,但是 253 + 1 不能使用 IEEE-754 直接表示,在就近舍入(round-to-nearest)和向零舍入中,會(huì)被舍入為 253。 Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 將得到 true的結(jié)果,而這在數(shù)學(xué)上是錯(cuò)誤的。 同樣 105308320612483198 === 105308320612483200 結(jié)果也是true
int64 類型的數(shù)值范圍是 -(2^63-1) 到 2^63-1。使用int64 類型json 對(duì)于超出范圍的數(shù)字,會(huì)出現(xiàn)解析錯(cuò)誤的情況。
一個(gè)建議:對(duì)于大數(shù)字來說,使用str 是一個(gè)好的選擇。或者用類似這樣的結(jié)構(gòu):
{"int": 105308320612483198, "int_str": "105308320612483198"}
在json 中使用的時(shí)候 使用 int_str 屬性。
python 對(duì)json 的處理
python 中 int 類型值遠(yuǎn)遠(yuǎn)超過IEEE 754 中定義的雙精度值的范圍,所以對(duì)于在 python?中使用的json數(shù)據(jù),可以使用放心使用 int64 類型(python中的long )。但是如果序列化后的數(shù)據(jù)要被其它語言的解析器(比如:JavaScript的解析器)解析的時(shí)候,就要當(dāng)心數(shù)值是不是超出了安全數(shù)的范圍。如果超出,這里推薦使用字符串類型來代替數(shù)值類型。
總結(jié)
以上是生活随笔為你收集整理的int64 java_为什么json 不能使用 int64类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 极米Z4Air投影仪怎么样,清晰吗
- 下一篇: java 唯一索引冲突_JPA merg