JSON整数:サイズの制限


81

JSON整数の大きさはどこでも指定されていますか?通常の(32ビット)intに制限されていると思いますが、それが書き留められている場所はどこにも見つかりません。Javaで長い識別子をエンコードする必要があるので、オーバーフローのリスクを回避するために、JSONの文字列としてそれらを格納する必要があると思います。

回答:


92

JSON番号は仕様によって制限されません。

JSON番号の文法

JSONはJavaScriptだけを対象とした抽象形式ではないため、実際のターゲット環境によって、解釈できるものの境界が決まります。

「JSON整数」はなく、「数値」データ型のサブセットであることも注目に値します。


12
実際問題として、Javascriptの整数は約2 ^ 53に制限されています(整数はなく、IEEE浮動小数点数のみ)。しかし、JSON仕様では、JSON番号のサイズに制限がないことは明らかです。
ネルソン

10
答えは技術的には正しいままですが、RFC 7159は相互運用可能と見なすべき整数の範囲を明確にするのに役立つため、更新する価値があります。(つまり、[-(2**53)+1, (2**53)-1]。)その範囲外で作業している場合は、文字列でエンコードされた整数を使用するか、実装の精度が低下することを期待してください。
トムクリスティー

@TomChristie JSON仕様では、RFC7159については言及されていません。
Tomalak 2017年

4
@ Tomalak-確かに-RFC7159は後で登場しました(2014)。以前に存在した不整合/エッジケースなどのいくつかを明確にします(実行可能な数値範囲についての言及がないなど)
Tom Christie

2
うーん、RFCを詳細に読んでも、数を制限することはありません。これは、多くのシステムが内部でIEEE754を使用していること、およびこの事実が受信者が解釈できるものに実際的な制限を課す可能性があることを示唆しているにすぎません。
Tomalak 2017年

18

RFC 7159:JavaScript Object Notation(JSON)データ交換形式

この仕様により、実装は受け入れられる数値の範囲と精度に制限を設定できます。IEEE 754-2008 binary64(倍精度)番号[IEEE754]を実装するソフトウェアは一般に入手可能であり、広く使用されているため、実装がJSONに近似するという意味で、これらが提供する以上の精度や範囲を期待しない実装によって、優れた相互運用性を実現できます。期待される精度の範囲内の数値。1E400や3.141592653589793238462643383279などのJSON番号は、相互運用性の潜在的な問題を示している可能性があります。これは、それを作成したソフトウェアが、受信ソフトウェアが広く利用可能な数値よりも優れた数値の大きさと精度を備えていることを期待しているためです。


「広く利用可能」とは、あいまいな言葉であるIMOです。一方、一部の実装(Pythonの標準jsonモジュールなど)は、64ビット(組み込みのbignum)を超えても、任意の整数を解析します。
TomaszGandor19年

IEEE754が「広く使用されている」と以前に述べられていたとき、「広く利用可能」はそれほど曖昧ではありません。
ジェイソンワーナー

8

Chrome(Macではv.23)コンソールを使用して次の実証テストを行いました。

> var j = JSON.parse("[999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999]")
undefined

> j[0]
1e+228

JSONがHTTPを介して渡される場合、数値はいずれの場合もJavaから文字列に変換され、問題はJavascriptでのみ発生する可能性があります。

以下からのECMAScript言語仕様4.3.19

4.3.19数値

倍精度64ビットバイナリ形式のIEEE754値に対応するプリミティブ値

注数値は数値タイプのメンバーであり、数値を直接表しています。

これは、ウィキペディアの倍精度浮動小数点形式で定義されているものです


2
ありがとう。この特定のJSON構造は、JavaのバックエンドWebサービスによって配布されているため、@ Tomalakの回答に従って、サーバー側のJSONライブラリが実際に何を行っているかを確認する必要があると思います。
Ian Dickinson

3
そして、記録のために、JacksonはJavalongsへのJSON入力の長整数を正しく解析します。
Ian Dickinson

また、記録として、JacksonはJava longを正しく出力しますが、少なくともChromeベースのブラウザは小数点以下3桁をゼロに設定します。つまり、数値の長さは正しいですが、小数点以下3桁は常に000を読み取ります
Johannes Jander 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.