JSON整数の大きさはどこに指定されていますか? それらは通常の(32ビット)intに限定されていると思いますが、それが書き留められている場所はどこにも見つかりません。Java で long の識別子をエンコードする必要があるため、オーバーフローの危険を冒さないように、それらを文字列として JSON に格納する必要があると思います。
3 に答える
JSON 番号は、仕様によって制限されません。
JSON は、JavaScript のみを対象とした抽象形式ではないため、実際の対象環境によって、解釈できるものの境界が決まります。
また、「JSON Integer」がなく、「Number」データ型のサブセットであることにも注意してください。
RFC 7159: JavaScript Object Notation (JSON) データ交換フォーマット
この仕様により、実装は受け入れられる数値の範囲と精度に制限を設定できます。IEEE 754-2008 binary64 (倍精度) 数値 [IEEE754] を実装するソフトウェアが一般に入手可能で広く使用されているため、実装が JSON に近似するという意味で、これらが提供する以上の精度や範囲を期待しない実装によって、優れた相互運用性を実現できます。予想される精度内の数値。1E400 や 3.141592653589793238462643383279 などの JSON 番号は、潜在的な相互運用性の問題を示している可能性があります。これは、それを作成したソフトウェアが、受信側のソフトウェアが数値の大きさと精度に関して広く利用できるよりも優れた機能を備えていることを期待していることを示唆しているためです。
Chrome (Mac では v.23) コンソールを使用して、次の実証テストを行いました。
> var j = JSON.parse("[999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999]")
undefined
> j[0]
1e+228
JSON が HTTP 経由で渡される場合、数値はいずれの場合も Java から文字列に変換され、問題は Javascript のみにある可能性があります。
4.3.19 数値
倍精度 64 ビット バイナリ形式の IEEE 754 値に対応するプリミティブ値
注 Number 値は Number 型のメンバーであり、数値を直接表現したものです。
ウィキペディア倍精度浮動小数点形式で定義されているものです。