JSON Toolkit

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.

Początkujący~3 min czytaniaOpublikowano 2026-10-30Zaktualizowano 2026-10-30
Co naprawdę dzieje się z NaN i Infinity w JSON-ie

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.stringify pomija też całkowicie undefined, funkcje i symbole; te klucze znikają, zamiast stawać się null
  • Domyślne allow_nan=True w Pythonie produkuje wyjście, które JSON.parse odrzuca

Dodatkowe materiały