JSON 숫자 타입 하나, 그리고 그건 float
JSON 숫자는 IEEE 754 double-precision float 에 매핑돼. spec 에 별도 정수 타입 없음; 5 와 5.0 은 같은 값. 대부분 파서가 내부에서 정수/float 구분 보존하지만 spec 은 안 요구.
문법 규칙
- leading zero 금지 —
007무효;7써. - 양수에
+금지 —+5무효;5써. - 소수점 양쪽에 숫자 필요 —
.5와5.무효;0.5와5.0써. - 지수 표기 OK —
1e6,1.5e-3,2E10다 유효. - NaN 과 Infinity 허용 안 됨 —
null로 인코딩, 또는 관행으로 tagged 문자열.
253 정밀도 절벽
JS 숫자 (와 대부분 JSON 파서) 는 Number.MAX_SAFE_INTEGER (= 253 - 1 = 9,007,199,254,740,991) 위로 정수 정밀도 잃어. 64-bit Twitter ID, Stripe object ID, 데이터베이스 BIGINT 가 통과시키면 조용히 반올림돼. 큰 정수는 문자열 로 보내.
Twitter ID 버그: Twitter API 가 64-bit tweet ID 반환. 10 년간 순진한 JS 클라이언트가 253 위 ID 를 조용히 손상. Twitter 문서가 결국
id 대신 id_str 읽으라고 안내. 큰 정수를 JSON 숫자로 보내는 API 는 지뢰밭 — 문서에 따로 명시 없으면 문자열로 가정해.