guide/json-diff.md

Cómo comparar JSON — ordenar claves y normalizar

Cómo eliminar las diferencias falsas que aparecen al comparar dos JSON por el orden de las claves, la sangría o la notación de los números, y qué pasa con el orden de los arrays, los enteros grandes y JSON Patch.

Última actualización: 2026-09-23

Es frecuente tener que comparar datos en JSON: respuestas de una API, archivos de configuración, archivos de traducción. Pero si comparas dos JSON tal cual, como texto, muchas veces aparecen montones de diferencias aunque los datos sean los mismos. Este artículo explica por qué y cómo solucionarlo.

Por qué aparecen diferencias falsas

El estándar JSON (RFC 8259) define un objeto como «una colección no ordenada de pares nombre/valor». Es decir, {"a":1,"b":2} y {"b":2,"a":1} representan los mismos datos. Pero como texto el orden de las líneas es distinto, y diff lo cuenta como diferencia. Además, estas otras diferencias aparecen sin que cambien los datos:

Solución: analizar y volver a escribir con la misma forma

El método más fiable es analizar (parsear) los dos JSON para convertirlos en datos y volver a serializarlos con las mismas reglas.

  1. Analiza los dos textos como JSON. Si hay errores de sintaxis, corrígelos primero.
  2. Ordena de forma recursiva las claves de todos los objetos.
  3. Vuelve a escribirlos con la misma sangría (por ejemplo, 2 espacios).
  4. Compara el resultado línea a línea.

Por ejemplo, estos dos JSON solo se diferencian en el orden de las claves y en el orden del array.

{"name":"kim","age":30,"tags":["a","b"]}
{"age":30,"name":"kim","tags":["b","a"]}

Tras ordenarlos y reescribirlos, la diferencia en el orden de las claves desaparece y solo queda la diferencia real: el orden del array.

@@ -2,7 +2,7 @@   "age": 30,   "name": "kim",   "tags": [-    "a",-    "b"+    "b",+    "a"   ] }

El orden de los arrays no se ordena

A diferencia de los objetos, en los arrays el orden tiene significado. ["a","b"] y ["b","a"] son datos distintos. Por eso, en principio, al normalizar no se ordenan los arrays. Aun así, si se trata de un array cuyo orden no importa en la práctica, como una lista de etiquetas, ordenarlo tú mismo antes de comparar hará que el resultado sea más fácil de leer. Lo correcto depende del significado de los datos.

Lo que cambia al analizar

El método de analizar y volver a escribir tiene efectos secundarios que conviene conocer.

Cómo hacerlo desde la línea de comandos

Si tienes jq instalado, puedes imprimir con las claves ordenadas usando la opción -S (--sort-keys).

jq -S . before.json > a.json
jq -S . after.json  > b.json
diff -u a.json b.json

Diferencia con JSON Patch

El resultado de diff es una lista de cambios por líneas pensada para que la lea una persona. En cambio, JSON Patch (RFC 6902) es un estándar que expresa los cambios mediante rutas dentro de la estructura JSON, como {"op":"replace","path":"/age","value":31}, y JSON Merge Patch (RFC 7396) consiste en superponer sobre el original un JSON que contiene solo las partes cambiadas. Si los cambios se intercambian entre programas, lo adecuado son estos estándares; si los revisa una persona, un diff de texto tras ordenar las claves.

Pruébalo en esta herramienta

Si activas Ordenar claves JSON en las opciones del comparador de textos, analiza ambos lados, ordena las claves, los reescribe con sangría de 2 espacios y luego los compara. No cambia el orden de los arrays y, si el análisis falla, indica en qué lado y en qué carácter está el error. También puedes arrastrar dos archivos .json a la vez. Para leer el resultado como patch, consulta Cómo leer un diff unificado.

Ir al comparador de textos