JSON Toolkit

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.

Débutant~3 min de lecturePublié le 2026-10-30Mis à jour le 2026-10-30
Ce qui arrive réellement à NaN et Infinity en JSON

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.stringify supprime aussi entièrement undefined, les fonctions et les symboles ; ces clés disparaissent plutôt que de devenir null
  • Le allow_nan=True par défaut de Python produit une sortie que JSON.parse rejette

Lectures complémentaires