JSON 정수 : 크기 제한


81

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

답변:


92

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

JSON 숫자 문법

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

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


12
실질적으로 Javascript 정수는 약 2 ^ 53으로 제한됩니다 (정수는없고 IEEE 부동 소수점 만 있음). 그러나 JSON 사양은 JSON 숫자의 크기가 무제한이라는 것이 분명합니다.
Nelson

10
답변은 기술적으로 정확하지만 업데이트 할 가치가 있습니다. RFC 7159는 상호 운용 가능한 정수 범위를 명확히하는 데 도움이되기 때문입니다. (즉 [-(2**53)+1, (2**53)-1].) 해당 범위 밖에서 작업하는 경우 문자열 인코딩 정수를 사용하거나 구현이 정밀도를 잃을 것으로 예상하십시오.
Tom Christie

@TomChristie JSON 사양에는 RFC7159에 대한 언급이 없습니다.
Tomalak

4
@Tomalak-물론-RFC7159는 나중에 출시되었습니다 (2014). 명확히 이전에 기존의 불일치 / 에지 경우 등 (이러한 가능한 숫자 범위에 대한 언급의 부족 등)의 일부
톰 크리스티

2
흠, RFC를 자세히 읽으면 여전히 숫자를 제한하지 않습니다. 이는 많은 시스템이 내부적으로 IEEE754를 사용하고 있으며이 사실이 수신자가 해석 할 수있는 내용에 실질적인 제한을 둘 수 있음을 암시 할뿐입니다.
Tomalak

18

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

이 사양을 사용하면 구현에서 허용되는 숫자의 범위와 정밀도에 대한 제한을 설정할 수 있습니다. IEEE 754-2008 binary64 (배정 밀도) 숫자 [IEEE754]를 구현하는 소프트웨어가 일반적으로 사용 가능하고 널리 사용되기 때문에 구현이 JSON에 가깝다는 점에서 이들보다 더 많은 정밀도 또는 범위를 기대하지 않는 구현으로 우수한 상호 운용성을 달성 할 수 있습니다. 예상 정밀도 내의 숫자. 1E400 또는 3.141592653589793238462643383279와 같은 JSON 숫자는이를 생성 한 소프트웨어가 수신 소프트웨어가 널리 사용 가능한 것보다 숫자 크기와 정밀도에 대해 더 큰 기능을 가질 것으로 예상하기 때문에 잠재적 인 상호 운용성 문제를 나타낼 수 있습니다.


'넓게 사용 가능'은 모호한 언어 인 IMO입니다. 한편, 일부 구현 (예 : Python의 표준 json모듈)은 64 비트 (내장 bignums)를 초과하는 경우에도 임의의 정수를 구문 분석합니다.
Tomasz Gandor

IEEE754가 '광범위하게 사용됨'이라고 이전에 언급되었을 때 '광범위하게 사용 가능'은 그다지 모호하지 않습니다.
Jason Warner

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 비트 이진 형식 IEEE 754 값에 해당하는 기본 값

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

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


2
감사. 이 특정 JSON 구조는 Java의 백엔드 웹 서비스에서 전달되므로 @Tomalak의 답변에 따라 서버 측 JSON 라이브러리가 실제로 무엇을하는지 확인해야 할 것 같습니다.
Ian Dickinson

3
그리고 기록을 위해 Jackson 은 JSON 입력의 long 정수를 Java long으로 올바르게 구문 분석합니다.
Ian Dickinson

또한 기록을 위해 Jackson은 Java long을 올바르게 내보내지만 Chrome 기반 브라우저는 마지막 소수점 3 자리를 0으로 설정합니다. 즉, 숫자의 길이는 정확하지만 마지막 소수점 3 자리는 항상 000으로 표시됩니다.
Johannes Jander
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.