JSON Toolkit

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“.

Začátečník~3 min čteníPublikováno 2026-10-30Aktualizováno 2026-10-30
Co se s NaN a Infinity v JSON skutečně stane

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.stringify také úplně zahazuje undefined, funkce a symboly; tyto klíče zmizí, místo aby se staly null
  • Pythoní výchozí allow_nan=True produkuje výstup, který JSON.parse odmítne

Další čtení