NaN ou Infinity peuvent-ils apparaître en JSON
L’essentiel : JSON n'a que des littéraux numériques décimaux. JSON.stringify transforme NaN et Infinity en null sans prévenir, ce qui explique pourquoi « le champ numérique est parfois null » revient sans cesse en production.

L'essentiel : JSON ne peut pas représenter NaN ni Infinity — JSON.stringify transforme silencieusement les deux en null — donc encodez l'état explicitement avec null plus un champ de raison, ou une valeur de chaîne documentée.
JSON.stringify({ ratio: NaN, limit: Infinity });
// '{"ratio":null,"limit":null}'
Pas d'erreur, pas d'avertissement. Deux nombres deviennent null.
Ce que la grammaire autorise
number = [ minus ] int [ frac ] [ exp ]
Décimales seulement. NaN et Infinity sont des sentinelles IEEE 754, pas des littéraux. Écrits dans JSON, ce sont des identifiants invalides, et comme leur sémantique de comparaison diffère selon les langages, la spécification les exclut plutôt que de choisir une représentation.
Ce que chaque langage fait à la place
| Langage | Comportement |
|---|---|
JavaScript JSON.stringify |
Émet silencieusement null |
Python json.dumps |
Émet NaN par défaut (non standard) ; lève avec allow_nan=False |
Go encoding/json |
Renvoie unsupported value: NaN |
| Java Jackson | Émet la chaîne "NaN" par défaut |
Quatre comportements pour une seule valeur. Quand une API inter-langages montre un champ numérique qui est par intermittence null, vérifiez d'abord cette couche.
Que faire à la place
Des chaînes documentées. "NaN", "Infinity" avec une note de type. Cela coûte à chaque consommateur une vérification explicite.
null plus un champ de statut. Mieux : {"avgLatency": null, "avgLatencyStatus": "no-sample"}. La raison voyage avec la valeur.
Repensez l'unité. La plupart des résultats Infinity viennent d'une division par zéro échantillon. Retourner null et afficher « pas encore de données » correspond généralement mieux à la vérité métier qu'un nombre infini.
Pièges associés
- Les bibliothèques de graphiques cassent la ligne sur
null— confirmez que c'est ce que vous voulez JSON.stringifysupprime aussi entièrementundefined, les fonctions et les symboles ; ces clés disparaissent plutôt que de devenirnull- Le
allow_nan=Truepar défaut de Python produit une sortie queJSON.parserejette