Guía

Claves duplicadas en JSON: qué ocurre y cómo evitarlas

Descubre por qué dos propiedades con el mismo nombre producen resultados imprevisibles y cómo detectar la pérdida de datos antes de convertir JSON.

por Tools in a Tab · Publicado el · Actualizada

Respuesta breve

Una clave duplicada en un objeto JSON no tiene un resultado portátil. La especificación recomienda que los nombres sean únicos, pero distintos analizadores pueden conservar el primer valor, el último, todos o rechazar la entrada. La solución segura es detectar la repetición y decidir qué valor era correcto antes de procesar o convertir el documento.

Ejemplo mínimo

Este texto tiene sintaxis JSON, pero repite estado:

{
  "estado": "pendiente",
  "estado": "enviado"
}

JSON.parse de JavaScript conserva el último valor, "enviado", en este ejemplo. Eso no convierte el documento en inequívoco: otro receptor puede actuar de otra manera. Además, cuando el primer valor se pierde, formatear el resultado ya no permite recuperarlo.

La sección 4 del RFC 8259 indica que los nombres de un objeto deberían ser únicos y advierte que el comportamiento con nombres repetidos es imprevisible entre implementaciones.

Cómo corregirlo

Primero averigua si la repetición es accidental o representa varios valores:

  • Si solo existe un estado vigente, conserva una única propiedad.
  • Si ambos valores forman una lista legítima, usa un array con un nombre claro.
  • Si son eventos históricos, modela objetos con fecha y estado en vez de repetir la clave.

Por ejemplo, una secuencia se representa sin ambigüedad así:

{
  "historial": [
    { "estado": "pendiente", "orden": 1 },
    { "estado": "enviado", "orden": 2 }
  ]
}

Cómo comprobarlo sin perder la evidencia

Haz la detección sobre el texto original, antes de convertirlo en un objeto del lenguaje. El conversor de JSON a CSV de Tools in a Tab rechaza nombres duplicados antes de generar filas, porque una tabla no podría decidir qué columna representa cada valor.

El validador JSON separa la sintaxis de la comprobación de duplicados. Con Comprobar también claves duplicadas activado, marca este ejemplo como sintaxis válida con un aviso de interoperabilidad y localiza ambas apariciones en el texto original. Ir a la repetición selecciona el nombre repetido sin cambiar la entrada. El formateador JSON conserva ambas apariciones porque trabaja sobre los tokens originales, no sobre un objeto JavaScript ya analizado. Ninguna de las dos herramientas decide el valor correcto ni elimina una propiedad por ti.

Por eso «se puede analizar» no equivale a «es interoperable». Comprueba las claves antes de una transformación que las reduzca a un solo valor: después, la colisión original puede haber desaparecido.

Probar una comprobación reproducible

  1. Abre el validador y pulsa Cargar ejemplo con duplicados, o descarga el JSON exacto y pega su texto sin analizarlo ni reserializarlo antes.
  2. Mantén Comprobar también claves duplicadas activado y valida.
  3. Deben aparecer dos repeticiones: status en línea 4, columna 3, y code en línea 6, columna 20. Sus primeras apariciones están en línea 3, columna 3, y línea 6, columna 7, respectivamente.
  4. Usa Ir a la repetición y decide qué estructura pretendías representar antes de editar los valores.

La escritura escapada "sta\u0074us" representa el mismo nombre que "status". Dos objetos diferentes pueden tener una propiedad code sin conflicto; el aviso corresponde solo al objeto que la repite. El mismo archivo contiene 9007199254740993, que permanece intacto en la entrada. Convertirlo a un número nativo de JavaScript puede redondearlo: no prepares la prueba analizando y reserializando el documento.

El análisis cuenta repeticiones, no nombres distintos, y muestra las primeras 20. Una entrada de más de 1.000.000 de unidades UTF-16 o con más de 100 niveles de contenedores genera un aviso explícito de comprobación incompleta o no realizada, no un resultado libre de duplicados. Primero hay que corregir los errores de sintaxis para poder ejecutar esta comprobación separada.

Regla práctica

Exige nombres únicos en cada objeto, activa una comprobación de duplicados en la entrada y no confíes en el orden para resolver conflictos. Si necesitas varios valores, exprésalos de forma explícita con un array o con propiedades diferentes. Así el mismo JSON conserva su significado al pasar entre lenguajes, APIs y herramientas.