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

Коротко: 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відхиляє