JSON Toolkit

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.

Principiante~3 min di letturaPubblicato il 2026-10-30Aggiornato il 2026-10-30
Cosa succede davvero a NaN e Infinity in JSON

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.stringify elimina anche completamente undefined, funzioni e simboli; quelle chiavi svaniscono invece di diventare null
  • Il default allow_nan=True di Python produce un output che JSON.parse rifiuta

Ulteriori letture