JSON Toolkit

NaN이나 Infinity가 JSON에 나올 수 있나

핵심 요약: JSON에는 십진수 리터럴만 있습니다. JSON.stringify가 NaN과 Infinity를 경고 없이 null로 바꾸므로 "숫자 필드가 때때로 null"이 운영에서 계속 나타납니다.

초급약 3분 소요2026-10-30 발행2026-10-30 업데이트
JSON에서 NaN과 Infinity가 실제로 어떻게 되는가

핵심부터 말하면, 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가 거부하는 출력을 냅니다.

더 읽을거리