JSON Diff (Comparar)
Compara dos archivos JSON al instante en tu navegador. Resaltado lado a lado, salida RFC 6902 JSON Patch, ignora campos ruidosos como marcas de tiempo e IDs. 100% privado, sin carga.
Opciones avanzadas
¿Qué es JSON Diff?
JSON Diff es una comparación estructural de dos documentos JSON que respeta el modelo de datos de JSON — las claves no tienen orden, los tipos son estrictos y los arrays pueden estar ordenados o indexados por clave. A diferencia de un diff de texto (que compara líneas e informa de reordenaciones de claves o espacios en blanco como diferencias), un JSON diff produce resultados semánticamente significativos.
La forma canónica legible por máquinas es JSON Patch (RFC 6902), un array ordenado de operaciones (add, remove, replace, move, copy, test) que transforma un documento en otro. Las rutas usan JSON Pointer (RFC 6901). Relacionado: JSON Merge Patch (RFC 7396) — más sencillo pero no puede distinguir 'eliminar clave' de 'asignar null a clave'. Esta herramienta genera RFC 6902.
La igualdad profunda en JSON con JavaScript es más compleja de lo que parece. JSON.stringify(a) === JSON.stringify(b) falla con reordenación de claves y engaña con -0 vs 0 (ambos se serializan como "0"). Un diff correcto debe recorrer ambos árboles en paralelo usando la unión de conjuntos de claves, distinguir null de ausente mediante el operador 'in', y decidir qué significa 'igual' para los números (Object.is por defecto, épsilon para tolerancia).
Esta herramienta se ejecuta completamente en tu navegador. Las entradas nunca abandonan tu equipo. Segura para respuestas de API, esquemas internos y configuraciones propietarias.
¿Trabajas con herramientas JSON relacionadas? Da formato con el Formateador JSON; convierte con JSON a YAML y YAML a JSON.
// Two JSON documents that look different but are semantically equal
const a = '{"a":1,"b":2}';
const b = '{"b":2,"a":1}';
// Naive comparison — wrong
JSON.stringify(JSON.parse(a)) === JSON.stringify(JSON.parse(b));
// → false (key order differs)
// JSON Diff (this tool) — correct: key order is irrelevant
// → 0 differences
// JSON Patch (RFC 6902) for { "a": 1 } → { "a": 2 }
// [{ "op": "replace", "path": "/a", "value": 2 }] Características principales
Vista lateral + JSON Patch
Dos vistas desde un diff: resaltado visual para revisión, patch RFC 6902 para automatización.
Ignorar campos ruidosos
Los presets con un clic eliminan /createdAt, /updatedAt, /*Id, /*At, requestId, traceId. Se admiten patrones Extended JSON Pointer personalizados.
Coincidir arrays por clave
Compara arrays de objetos por un campo id en lugar de por índice — para envs de K8s, entradas de package-lock o cualquier lista lógicamente desordenada.
Estricto con los tipos por defecto
1 ≠ "1". null ≠ ausente. Detecta la deriva de serialización del backend en el momento en que aterrice en un fixture de prueba.
100% basado en el navegador
Las entradas nunca abandonan tu equipo. Sin carga, sin localStorage del JSON, sin análisis de lo que pegas.
Comparte el enlace, no los datos
Compartir enlace solo escribe tu configuración en la URL. Tus entradas JSON permanecen locales.
Ejemplos
Regresión de respuesta de API
{"user":{"id":1,"name":"Ada","createdAt":"2024-01-01"}} {"user":{"id":1,"name":"Ada Lovelace","createdAt":"2024-02-02"}} Dos cambios (name + createdAt). Añade /user/createdAt a las rutas ignoradas y solo quedará el cambio de nombre.
Auditoría de archivo de configuración (reordenación de claves)
{"a":1,"b":2,"c":3} {"c":3,"a":1,"b":2} Mismos datos, distinto orden de claves. JSON Diff trata el orden de claves como semánticamente irrelevante — el diff está vacío.
Array de objetos (coincidencia por clave)
[{"id":1,"qty":3},{"id":2,"qty":5}] [{"id":2,"qty":5},{"id":1,"qty":4}] Cambia el modo de Array a 'Coincidir por clave' con key=id. Sin alineación, cada elemento parece modificado; con alineación, solo cambia qty en id=1.
Salida JSON Patch (RFC 6902)
{"items":[{"id":1,"price":29.99}]} {"items":[{"id":1,"price":24.99}]} Cambia a la pestaña JSON Patch para obtener [{"op":"replace","path":"/items/0/price","value":24.99}] que puedes aplicar con fast-json-patch.
Cómo usar
- 1
Pega ambos documentos JSON
Pega el JSON original (izquierda) y el modificado (derecha). El diff en vivo se renderiza mientras escribes; las entradas grandes (>200 KB) cambian a un botón manual de Diff.
- 2
Filtra el ruido
Haz clic en un preset (Timestamps / IDs / Trace) o pega patrones Extended JSON Pointer en las rutas ignoradas para eliminar campos irrelevantes.
- 3
Elige la vista que necesitas
Vista lateral para revisión humana, JSON Patch (RFC 6902) para operaciones aplicables por máquinas. Usa Compartir enlace para enviar la configuración a un compañero.
Errores comunes al comparar
Ruido por orden de claves (síntoma de diff de texto)
Si tu herramienta de diff informa {"a":1,"b":2} vs {"b":2,"a":1} como diferente, está haciendo diff de líneas, no diff de JSON. Las claves JSON no tienen orden — esta herramienta ignora el orden de claves automáticamente.
diff a.json b.json # text diff: 'everything changed'
JSON Diff (this tool): 0 differences
Confusión entre null y ausente
{"a":null} y {} no son lo mismo. Tratarlos como iguales oculta errores reales del backend.
{"a": null} == {} # collapsed by some tools {"a": null} ≠ {} # type-strict diff Orden de arrays sin alineación por clave
[{id:1},{id:2}] vs [{id:2},{id:1}] no son 'dos cambios' para un conjunto lógico. El modo secuencial lo reporta así; cambia a Coincidir por clave.
Sequential diff: 4 modified
Match by key (id): 0 differences
Deriva de tipo (número vs cadena)
Los backends a veces serializan IDs de forma inconsistente — 42 vs "42". La herramienta marca estos como modificaciones de 'tipo' para que puedas detectar la deriva pronto.
{"id": 42} vs {"id": "42"} # serialization bug Diff reports 'modified (type)' with both values
Precisión de punto flotante
0.1 + 0.2 !== 0.3 en IEEE 754. Con tolerance=0 (por defecto), esto se marca. Establece la tolerancia a 1e-9 si deseas equivalencia numérica.
tolerance=0: 0.30000000000000004 ≠ 0.3
tolerance=1e-9: equal
Ruido de marcas de tiempo y UUID
createdAt, updatedAt, requestId, traceId cambian en cada petición. Usa los presets de rutas ignoradas para eliminarlos.
Diff: 47 modifications (45 are timestamps)
Add /createdAt, /updatedAt, /requestId to Ignore paths → 2 real changes
Casos de uso comunes
- Regresión de respuesta de API
- Compara respuestas de staging vs producción; ignora marcas de tiempo e IDs de petición para mostrar solo los cambios de payload significativos.
- Fallos de pruebas de snapshot en CI
- Pega el actual vs el esperado de un snapshot fallido en Jest/Vitest. Filtra el ruido y encuentra el cambio real en segundos.
- Conflictos en package-lock / yarn.lock
- Resuelve conflictos de fusión alineando dependencias por nombre; el orden de claves y los campos no relacionados dejan de ser ruido.
- Auditoría de valores K8s / Helm
- Alinea envs, volumeMounts y ports por nombre. Detecta ordenaciones no intencionadas frente a ediciones reales de configuración.
- Cobertura de traducción i18n
- Compara en.json contra zh.json estructuralmente para encontrar claves de traducción faltantes o extra sin ruido de valores.
- Revisión de plan Terraform / CDK
- Compara la salida del plan entre ejecuciones; la tolerancia numérica gestiona la aritmética de punto flotante, las rutas ignoradas eliminan ARNs y marcas de tiempo.
Detalles técnicos
- Salida de patch conforme con RFC 6902
- Genera operaciones JSON Patch válidas (add/remove/replace) con rutas RFC 6901. Verificado contra los paquetes npm fast-json-patch@3.x y rfc6902.
- Traversal iterativo
- Recorrido con pila explícita (sin recursión) limitado a 100.000 nodos y profundidad 64 para evitar desbordamiento de pila en entradas adversariales.
- Igualdad numérica con Object.is
- La tolerancia numérica predeterminada es 0 — usa Object.is para distinguir -0 de +0. Establece tolerancia > 0 para igualdad basada en épsilon.
Buenas prácticas
- Filtra antes de revisar
- Añade primero las rutas ignoradas (marcas de tiempo, IDs, campos de traza) y luego lee el diff. Revisar diffs ruidosos entrena el ojo a saltarse — y perderse — los cambios reales.
- Coincidencia por clave para conjuntos lógicos
- Si tu array representa un conjunto desordenado (envs, usuarios, dependencias), usa Coincidir por clave. El diff secuencial en conjuntos lógicos casi siempre es incorrecto.
- Comparte el enlace, no las entradas
- Usa Compartir enlace para enviar a un compañero tu configuración de filtros — nunca pegues JSON sensible en documentos compartidos. La URL contiene solo la configuración.
Preguntas frecuentes
¿Por qué el diff muestra todo como modificado si solo cambié un campo?
¿Cómo ignoro marcas de tiempo e IDs en JSON diff?
¿Cuál es la diferencia entre JSON Patch y un diff visual?
¿JSON diff trata null y clave inexistente como lo mismo?
¿Cómo se comparan los arrays — por índice o por clave?
¿Puedo exportar el diff como RFC 6902 JSON Patch?
¿JSON Patch es lo mismo que JSON Merge Patch (RFC 7396)?
¿Cómo comparo dos archivos JSON grandes (>10 MB)?
¿La herramienta envía mi JSON a un servidor?
¿Por qué 42 es diferente de "42" en el diff?
¿Puedo comparar JSON con comentarios (JSONC) o comas finales?
¿Cómo comparo arrays anidados de objetos por una clave como id?
¿El diff maneja la precisión de punto flotante (0.1 + 0.2)?
Herramientas relacionadas
Ver todas las herramientas →Decodificador y Codificador Base64
Codificación y Formato
Decodifica y codifica Base64 online de forma gratuita. Conversión en tiempo real con soporte completo de UTF-8 y emojis. 100% privado — funciona en tu navegador. Sin registro.
Formateador y Validador JSON
Codificación y Formato
Formatea, valida y embellece JSON al instante en tu navegador. Herramienta gratuita con validación sintáctica, detección de errores, minificación y copia con un clic. 100% privado.
Convertidor JSON a YAML
Codificación y Formato
Convierte JSON a YAML al instante en tu navegador. Listo para K8s y Compose, sangría 2/4 espacios, protección Norway automática. 100% privado, sin carga.
Codificador y Decodificador URL con Analizador Integrado
Codificación y Formato
Pega una URL para decodificarla o codificarla al instante. Analizador integrado descompone protocolo, host, ruta y parámetros en campos editables. Modos encodeURI y encodeURIComponent. 100% navegador — sin envío de datos.
Convertidor YAML a JSON
Codificación y Formato
Convierte YAML a JSON al instante en tu navegador. Compatible con manifiestos K8s, specs OpenAPI y valores Helm. Sin servidor, 100% privado.
Conversor de Bases — Binario, Hex, Decimal, Octal
Herramientas de Conversión
Convierte números entre binario, hexadecimal, decimal, octal y cualquier base personalizada (2-36) al instante. Gratis, privado, sin registro — todo el procesamiento ocurre en tu navegador.