Czy NaN lub Infinity mogą występować w JSON
Podsumowanie: JSON ma tylko dziesiętne literały liczbowe. JSON.stringify zamienia NaN i Infinity na null bez ostrzeżenia, dlatego „pole liczbowe czasami jest null” wciąż pojawia się w produkcji.

Najważniejsze: JSON nie potrafi przedstawić NaN ani Infinity — JSON.stringify po cichu zamienia oba na null — więc koduj stan jawnie przez null plus pole przyczyny albo udokumentowaną wartość łańcuchową.
JSON.stringify({ ratio: NaN, limit: Infinity });
// '{"ratio":null,"limit":null}'
Żadnego błędu, żadnego ostrzeżenia. Dwie liczby stają się null.
Co dopuszcza gramatyka
number = [ minus ] int [ frac ] [ exp ]
Tylko dziesiętne. NaN i Infinity to wartowniki IEEE 754, a nie literały. Wpisane w JSON są niepoprawnymi identyfikatorami, a ponieważ ich semantyka porównań różni się między językami, specyfikacja wyklucza je, zamiast wybierać przedstawienie.
Co zamiast tego robi każdy język
| Język | Zachowanie |
|---|---|
JavaScript JSON.stringify |
Po cichu emituje null |
Python json.dumps |
Domyślnie emituje NaN (niestandardowo); rzuca przy allow_nan=False |
Go encoding/json |
Zwraca unsupported value: NaN |
| Java Jackson | Domyślnie emituje łańcuch "NaN" |
Cztery zachowania dla jednej wartości. Gdy międzyjęzykowowe API pokazuje pole liczbowe, które okresowo jest null, sprawdź najpierw tę warstwę.
Co zrobić zamiast tego
Udokumentowane łańcuchy. "NaN", "Infinity" z uwagą o typie. Kosztuje każdego konsumenta jawne sprawdzenie.
null plus pole statusu. Lepiej: {"avgLatency": null, "avgLatencyStatus": "no-sample"}. Przyczyna podróżuje z wartością.
Przemyśl jednostkę. Większość wyników Infinity pochodzi z dzielenia przez zero próbek. Zwrócenie null i renderowanie „brak danych na razie” zwykle lepiej odpowiada prawdzie biznesowej niż nieskończona liczba.
Powiązane pułapki
- Biblioteki wykresów łamią linię na
null— potwierdź, że tego chcesz JSON.stringifypomija też całkowicieundefined, funkcje i symbole; te klucze znikają, zamiast stawać sięnull- Domyślne
allow_nan=Truew Pythonie produkuje wyjście, któreJSON.parseodrzuca