[json] JSON 정수 : 크기 제한

JSON 정수가 얼마나 큰지 어디에서나 지정됩니까? 나는 그들이 일반 (32 비트) int로 제한되어 있다고 추측하고 있지만 기록 된 곳을 찾을 수 없습니다. Java에서 long 인 식별자를 인코딩해야하므로 오버플로 위험을 방지하기 위해 JSON에 문자열로 저장해야한다고 가정합니다.



답변

JSON 번호는 사양에 의해 제한되지 않습니다 .

JSON 숫자 문법

JSON은 JavaScript만을 대상으로하지 않는 추상 형식이므로 실제 대상 환경은 해석 할 수있는 범위를 결정합니다.

“JSON Integers”가 없으며 “Number”데이터 유형의 하위 집합이라는 점도 주목할 가치가 있습니다.


답변

RFC 7159 : JSON (JavaScript Object Notation) 데이터 교환 형식

이 사양을 사용하면 구현에서 허용되는 숫자의 범위와 정밀도에 대한 제한을 설정할 수 있습니다. 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에서만 발생할 수 있습니다.

에서 인 ECMAScript 언어 사양 4.3.19 :

4.3.19 숫자 값

배정 밀도 64 비트 이진 형식 IEEE 754 값에 해당하는 기본 값

주 숫자 값은 숫자 유형의 멤버이며 숫자를 직접 표현합니다.

wikipedia Double-precision floating-point format에 정의 된 내용 입니다 .


답변