NaN이나 Infinity가 JSON에 나올 수 있나
핵심 요약: JSON에는 십진수 리터럴만 있습니다. JSON.stringify가 NaN과 Infinity를 경고 없이 null로 바꾸므로 "숫자 필드가 때때로 null"이 운영에서 계속 나타납니다.
초급약 3분 소요2026-10-30 발행2026-10-30 업데이트

핵심부터 말하면, JSON은 NaN이나 Infinity를 표현하지 못하고 JSON.stringify가 둘 다 조용히 null로 바꿉니다. null과 이유 필드, 또는 문서화된 문자열 값으로 상태를 명시적으로 인코딩하세요.
JSON.stringify({ ratio: NaN, limit: Infinity });
// '{"ratio":null,"limit":null}'
오류도 경고도 없습니다. 두 숫자가 null이 됩니다.
문법이 허용하는 것
number = [ minus ] int [ frac ] [ exp ]
십진수만입니다. NaN과 Infinity는 리터럴이 아니라 IEEE 754 센티널입니다. JSON에 쓰면 무효 식별자이고, 언어마다 비교 의미가 달라 명세는 표현을 고르기보다 배제합니다.
각 언어가 대신 하는 것
| 언어 | 동작 |
|---|---|
JavaScript JSON.stringify |
조용히 null을 냄 |
Python json.dumps |
기본으로 NaN을 냄(비표준), allow_nan=False면 던짐 |
Go encoding/json |
unsupported value: NaN을 반환 |
| Java Jackson | 기본으로 문자열 "NaN"을 냄 |
하나의 값에 네 동작. 언어 간 API에서 숫자 필드가 간헐적으로 null로 보이면 이 계층을 먼저 확인하세요.
대신 무엇을 해야 하나
문서화된 문자열. "NaN", "Infinity"와 타입 주석. 모든 소비자에게 명시적 검사가 필요합니다.
null과 상태 필드. 더 낫습니다: {"avgLatency": null, "avgLatencyStatus": "no-sample"}. 이유가 값과 함께 이동합니다.
단위 재고. 대부분의 Infinity 결과는 0 표본으로 나눈 데서 옵니다. null을 반환하고 "아직 데이터 없음"을 렌더하는 것이 무한수보다 업무 진실에 맞는 경우가 많습니다.
관련 함정
- 차트 라이브러리가
null에서 선을 끊습니다. 의도한 것인지 확인하세요. JSON.stringify는undefined, 함수, 심볼도 완전히 버립니다. 그 키는null이 아니라 사라집니다.- Python의 기본
allow_nan=True는JSON.parse가 거부하는 출력을 냅니다.