JSON Toolkit

Чи можуть NaN або Infinity зʼявлятися в JSON

Головне: У JSON лише десяткові числові літерали. JSON.stringify перетворює NaN і Infinity на null без попередження, і саме тому «числове поле іноді null» постійно виринає у виробництві.

Початковий~3 хв читанняОпубліковано 2026-10-30Оновлено 2026-10-30
Що насправді відбувається з NaN і Infinity в JSON

Коротко: 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 походять із ділення на нуль зразків. Повернення null і відображення «даних ще немає» зазвичай краще відповідає бізнес-істині, ніж нескінченне число.

Повʼязані пастки

  • Бібліотеки графіків розривають лінію на null — підтвердьте, що ви цього хочете
  • JSON.stringify також цілком відкидає undefined, функції й символи; ті ключі зникають, а не стають null
  • Типове allow_nan=True у Python продукує вивід, який JSON.parse відхиляє

Додаткове читання