¿Pueden aparecer NaN o Infinity en JSON?
En resumen: JSON solo tiene literales numéricos decimales. JSON.stringify convierte NaN e Infinity en null sin avisar, y por eso «el campo numérico a veces es null» no deja de aparecer en producción.

En resumen: JSON no puede representar NaN ni Infinity —JSON.stringify convierte ambos silenciosamente en null—, así que codifica el estado explícitamente con null más un campo de motivo, o con un valor de cadena documentado.
JSON.stringify({ ratio: NaN, limit: Infinity });
// '{"ratio":null,"limit":null}'
Sin error, sin aviso. Dos números se convierten en null.
Qué permite la gramática
number = [ minus ] int [ frac ] [ exp ]
Solo decimales. NaN e Infinity son centinelas de IEEE 754, no literales. Escritos en JSON son identificadores inválidos, y como su semántica de comparación difiere entre lenguajes, la especificación los excluye en lugar de elegir una representación.
Qué hace cada lenguaje en su lugar
| Lenguaje | Comportamiento |
|---|---|
JSON.stringify de JavaScript |
Emite null silenciosamente |
json.dumps de Python |
Emite NaN por defecto (no estándar); lanza con allow_nan=False |
encoding/json de Go |
Devuelve unsupported value: NaN |
| Jackson de Java | Emite la cadena "NaN" por defecto |
Cuatro comportamientos para un mismo valor. Cuando una API entre lenguajes muestra un campo numérico que es null de forma intermitente, revisa primero esta capa.
Qué hacer en su lugar
Cadenas documentadas. "NaN", "Infinity" con una nota de tipo. Le cuesta a cada consumidor una comprobación explícita.
null más un campo de estado. Mejor: {"avgLatency": null, "avgLatencyStatus": "no-sample"}. El motivo viaja con el valor.
Replantear la unidad. La mayoría de los resultados Infinity vienen de dividir por cero muestras. Devolver null y mostrar «aún no hay datos» normalmente se ajusta mejor a la verdad del negocio que un número infinito.
Trampas relacionadas
- Las bibliotecas de gráficos rompen la línea en
null; confirma que es lo que quieres JSON.stringifytambién descarta por completoundefined, las funciones y los símbolos; esas claves desaparecen en lugar de convertirse ennull- El
allow_nan=Truepredeterminado de Python produce una salida queJSON.parserechaza