NaN o Infinity possono comparire in JSON
In sintesi: JSON ha solo letterali numerici decimali. JSON.stringify trasforma NaN e Infinity in null senza avvisare, ed è per questo che "il campo numerico a volte è null" continua a comparire in produzione.

In sintesi: JSON non può rappresentare NaN o Infinity — JSON.stringify trasforma silenziosamente entrambi in null — quindi codifica lo stato in modo esplicito con null più un campo motivo, oppure con un valore stringa documentato.
JSON.stringify({ ratio: NaN, limit: Infinity });
// '{"ratio":null,"limit":null}'
Nessun errore, nessun avviso. Due numeri diventano null.
Cosa consente la grammatica
number = [ minus ] int [ frac ] [ exp ]
Solo decimali. NaN e Infinity sono sentinelle IEEE 754, non letterali. Scritti in JSON sono identificatori invalidi, e poiché la loro semantica di confronto differisce tra linguaggi, la specifica li esclude invece di scegliere una rappresentazione.
Cosa fa invece ciascun linguaggio
| Linguaggio | Comportamento |
|---|---|
JavaScript JSON.stringify |
Emette silenziosamente null |
Python json.dumps |
Emette NaN per impostazione predefinita (non standard); lancia con allow_nan=False |
Go encoding/json |
Restituisce unsupported value: NaN |
| Java Jackson | Emette la stringa "NaN" per impostazione predefinita |
Quattro comportamenti per un valore. Quando un'API cross-linguaggio mostra un campo numerico che è a intermittenza null, controlla prima questo strato.
Cosa fare invece
Stringhe documentate. "NaN", "Infinity" con una nota sul tipo. Costa a ogni consumatore un controllo esplicito.
null più un campo di stato. Meglio: {"avgLatency": null, "avgLatencyStatus": "no-sample"}. Il motivo viaggia insieme al valore.
Ripensa l'unità. La maggior parte dei risultati Infinity deriva dalla divisione per zero campioni. Restituire null e renderizzare "ancora nessun dato" di solito corrisponde meglio alla verità di business rispetto a un numero infinito.
Trappole correlate
- Le librerie di grafici interrompono la linea su
null— conferma che è ciò che vuoi JSON.stringifyelimina anche completamenteundefined, funzioni e simboli; quelle chiavi svaniscono invece di diventarenull- Il default
allow_nan=Truedi Python produce un output cheJSON.parserifiuta