JSON Toolkit

¿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.

Principiante~3 min de lecturaPublicado el 2026-10-30Actualizado el 2026-10-30
Qué ocurre realmente con NaN e Infinity en JSON

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.stringify también descarta por completo undefined, las funciones y los símbolos; esas claves desaparecen en lugar de convertirse en null
  • El allow_nan=True predeterminado de Python produce una salida que JSON.parse rechaza

Lectura adicional