Může se v JSON objevit NaN nebo Infinity
Shrnutí: JSON má jen desetinné číselné literály. `JSON.stringify` mění NaN a Infinity na null bez varování, a proto se v produkci stále objevuje „číslo pole je někdy null“.

Stručně: JSON neumí reprezentovat NaN ani Infinity – JSON.stringify obojí tiše změní na null – takže stav kódujte explicitně pomocí null plus pole s důvodem, nebo dokumentovanou řetězcovou hodnotou.
JSON.stringify({ ratio: NaN, limit: Infinity });
// '{"ratio":null,"limit":null}'
Žádná chyba, žádné varování. Dvě čísla se stanou null.
Co gramatika povoluje
number = [ minus ] int [ frac ] [ exp ]
Jen desetinná čísla. NaN a Infinity jsou sentinely IEEE 754, nikoli literály. Zapsané do JSON jsou neplatné identifikátory, a protože se jejich sémantika porovnávání mezi jazyky liší, specifikace je vylučuje, místo aby zvolila reprezentaci.
Co místo toho dělá který jazyk
| Jazyk | Chování |
|---|---|
JavaScript JSON.stringify |
Tiše vypíše null |
Python json.dumps |
Ve výchozím nastavení vypíše NaN (ne‑standardní); s allow_nan=False vyhodí chybu |
Go encoding/json |
Vrací unsupported value: NaN |
| Java Jackson | Ve výchozím nastavení vypíše řetězec "NaN" |
Čtyři chování pro jednu hodnotu. Když API napříč jazyky ukazuje číselné pole, které je občas null, zkontrolujte nejprve tuto vrstvu.
Co dělat místo toho
Dokumentované řetězce. "NaN", "Infinity" s poznámkou o typu. Každého konzumenta stojí explicitní kontrolu.
null plus stavové pole. Lepší: {"avgLatency": null, "avgLatencyStatus": "no-sample"}. Důvod cestuje s hodnotou.
Znovu promyslete jednotku. Většina výsledků Infinity pochází z dělení nulovým počtem vzorků. Vrátit null a vykreslit „zatím žádná data“ obvykle odpovídá obchodní skutečnosti lépe než nekonečné číslo.
Související úskalí
- Knihovny grafů přerušují čáru u
null– potvrďte, že to je to, co chcete JSON.stringifytaké úplně zahazujeundefined, funkce a symboly; tyto klíče zmizí, místo aby se stalynull- Pythoní výchozí
allow_nan=Trueprodukuje výstup, kterýJSON.parseodmítne