alltools.one
JSON
2025-06-24
7 min
alltools.one Team
JSONDiffDebuggingAPITesting

Guía de Depuración con JSON Diff: Encuentra Cambios en Datos Complejos

Las herramientas estándar de diff de texto tienen dificultades con JSON. El reordenamiento de claves, cambios de espacios en blanco y anidación profunda crean diffs ruidosos que oscurecen los cambios reales de datos. El diff estructural de JSON compara la semántica — los datos reales — en lugar de la representación de texto. Esta guía cubre técnicas para comparación y depuración efectiva de JSON.

Por Qué el Diff Estándar Falla para JSON

Considera dos objetos JSON que son semánticamente idénticos:

Versión A:

{"name":"Alice","age":30,"roles":["admin","editor"]}

Versión B:

{
  "age": 30,
  "name": "Alice",
  "roles": ["admin", "editor"]
}

Un diff de texto muestra cada línea como cambiada, pero los datos son idénticos. El diff estructural reconoce que son iguales.

Ahora considera un cambio real:

// Before
{ "user": { "name": "Alice", "permissions": ["read", "write", "admin"] } }

// After
{ "user": { "name": "Alice", "permissions": ["read", "write"] } }

Un diff estructural reporta: removed user.permissions[2]: "admin" — exactamente la información que necesitas.

Pruébalo instantáneamente con nuestra herramienta JSON Diff.

Tipos de Cambios en JSON

El diff estructural de JSON categoriza los cambios en:

Tipo de CambioEjemplo
AgregadoNueva clave o elemento de array
EliminadoClave o elemento de array faltante
ModificadoValor cambiado para clave existente
Tipo CambiadoTipo de valor cambiado (string → number)
MovidoElemento de array reordenado

JSON Diff en Línea de Comandos

jq para Comparación Rápida

# Sort keys and compare
diff <(jq -S . before.json) <(jq -S . after.json)

# Compare specific paths
diff <(jq '.config.database' before.json) <(jq '.config.database' after.json)

Herramientas Especializadas

# json-diff (npm)
npx json-diff before.json after.json

# Output:
# {
#   "user": {
#     "permissions": [
#       "read",
#       "write",
#-      "admin"
#     ]
#   }
# }

# jd (Go)
jd before.json after.json

Depurando Cambios en Respuestas de API

Cuando una respuesta de API cambia inesperadamente, la comparación sistemática ayuda a identificar la causa raíz:

Paso 1: Capturar Línea Base

Guarda una respuesta conocida como correcta:

curl -s https://api.example.com/users/123 | jq -S . > baseline.json

Paso 2: Capturar Actual

curl -s https://api.example.com/users/123 | jq -S . > current.json

Paso 3: Diff Estructural

# Human-readable
npx json-diff baseline.json current.json

# Machine-readable (JSON Patch format)
npx json-diff baseline.json current.json --json

Paso 4: Filtrar Ruido

Excluye campos que cambian en cada solicitud (timestamps, IDs de solicitud):

# Remove volatile fields before comparing
jq 'del(.meta.requestId, .meta.timestamp)' response.json

JSON Patch (RFC 6902)

JSON Patch es un formato estandarizado para describir cambios en un documento JSON:

[
  { "op": "replace", "path": "/user/name", "value": "Bob" },
  { "op": "remove", "path": "/user/permissions/2" },
  { "op": "add", "path": "/user/email", "value": "bob@example.com" }
]

Operaciones:

  • add: Agregar un nuevo valor
  • remove: Eliminar un valor
  • replace: Cambiar un valor existente
  • move: Mover un valor a una nueva ruta
  • copy: Copiar un valor a una nueva ruta
  • test: Verificar que un valor existe (para parches condicionales)

JSON Patch es útil para enviar actualizaciones incrementales a una API en lugar de reemplazar el documento completo.

Detección de Desviación de Configuración

Rastrea cambios en archivos de configuración a lo largo del tiempo:

#!/bin/bash
# drift-check.sh
BASELINE="config-baseline.json"
CURRENT="config-current.json"

DIFF=$(npx json-diff "$BASELINE" "$CURRENT" 2>/dev/null)

if [ -n "$DIFF" ]; then
  echo "Configuration drift detected:"
  echo "$DIFF"
  exit 1
fi

echo "No drift detected."

Testing con JSON Diff

Usa comparación estructural en tests para validar respuestas de API:

const { diff } = require('json-diff');

test('API response matches expected structure', async () => {
  const response = await fetch('/api/users/123');
  const data = await response.json();
  
  const expected = {
    id: 123,
    name: 'Alice',
    role: 'admin'
  };
  
  const changes = diff(expected, data);
  expect(changes).toBeUndefined(); // undefined means identical
});

Manejo de Archivos JSON Grandes

Para archivos JSON de varios megabytes, el diff visual se vuelve impráctico:

  1. Consulta primero: Usa JSONPath para extraer la sección relevante antes de hacer diff. Consulta nuestra guía de JSONPath.
  2. Modo resumen: Cuenta los cambios por tipo en lugar de mostrar cada cambio
  3. Diff en streaming: Herramientas como jd manejan archivos grandes eficientemente mediante streaming
# Extract and compare a specific section
jq '.data.users[:10]' large-before.json > section-before.json
jq '.data.users[:10]' large-after.json > section-after.json
npx json-diff section-before.json section-after.json

FAQ

¿Debería usar JSON Patch o JSON Merge Patch?

JSON Patch (RFC 6902) usa un array de operaciones y puede expresar cualquier cambio, incluyendo manipulación de elementos de array. JSON Merge Patch (RFC 7396) es más simple — envías un objeto JSON parcial y se fusiona con el objetivo. Usa Merge Patch para actualizaciones simples de objetos; usa JSON Patch cuando necesites manipulación de arrays u operaciones atómicas.

¿Cómo hago diff de JSON con diferente orden de claves?

La mayoría de las herramientas de diff estructural de JSON tratan el orden de claves como insignificante — {"a":1,"b":2} es igual a {"b":2,"a":1}. Para herramientas basadas en texto, normaliza primero con jq -S . que ordena las claves alfabéticamente. Nuestra herramienta JSON Diff maneja el orden de claves automáticamente.

Recursos Relacionados

Published on 2025-06-24
JSON Diff Debugging Guide: Find Changes in Complex Data | alltools.one