- JSON Patch es un formato estándar definido en RFC 6902 para modificar documentos JSON
- Proporciona una forma simple y eficiente de actualizar parcialmente recursos a través de HTTP
- Mientras que los métodos
PUT y POST existentes requerían enviar todos los datos, el método PATCH permite actualizaciones parciales
- JSON Patch ofrece una representación clara y concisa de los cambios en documentos JSON, lo que reduce el uso de ancho de banda y mejora el rendimiento de las aplicaciones web
Cómo funciona JSON Patch
- JSON Patch funciona como una serie de operaciones atómicas sobre un documento JSON.
- Cada operación incluye los campos
op y path, y realiza una acción en una ubicación específica del documento.
- Por ejemplo, la operación
add agrega un campo nuevo, y la operación replace sustituye un campo existente.
JSON Pointer
- JSON Patch usa JSON Pointer para identificar partes específicas del documento.
- JSON Pointer es una cadena de tokens separada por barras (
/) que identifica la estructura jerárquica del documento.
- Por ejemplo,
/user/name identifica el campo name dentro del objeto user.
Ventajas y desventajas de JSON Patch
Ventajas
- Precisión: permite modificar con exactitud elementos específicos dentro de estructuras complejas.
- Eficiencia: minimiza la cantidad de datos transferidos y la latencia al enviar solo los cambios.
- Atomicidad: permite revertir toda la operación si alguna acción falla.
- Idempotencia: permite reintentos seguros.
- Operaciones complejas: permite mover o copiar elementos.
- Validación: la API puede validar los parches entrantes para reducir solicitudes inválidas.
- Basado en estándares: se integra fácilmente con distintos clientes y servidores.
- Control de acceso a nivel de campo: permite restringir modificaciones con granularidad fina.
- Operaciones por lotes: permite procesar varios cambios en una sola solicitud.
Desventajas
- Complejidad: puede ser difícil manejar estructuras JSON complejas.
- Costo de mantenimiento: las rutas pueden quedar invalidadas a medida que la API evoluciona.
- Dificultad para depurar: puede ser complicado rastrear problemas cuando varias operaciones se agrupan juntas.
- Conservación del orden de objetos: las operaciones de movimiento no garantizan el orden de los objetos.
- Problemas de seguridad: pueden surgir vulnerabilidades si las solicitudes inválidas no se manejan correctamente.
Ejemplos de operaciones de JSON Patch
- Add: agrega un campo nuevo.
- Remove: elimina un campo existente.
- Replace: sustituye un campo existente por un valor nuevo.
- Move: mueve un elemento a otra ubicación.
- Copy: copia un elemento a otra ubicación.
- Test: verifica si hay un valor establecido en una ruta específica.
JSON Patch en herramientas y bibliotecas
- Existen bibliotecas con soporte para JSON Patch en varios lenguajes de programación: fast-json-patch, python-json-patch, JsonPatch library in .NET, entre otras
- Una excelente herramienta para aprender JSON Patch es jsonpatch.me, un servicio en línea gratuito para ejecutar comandos de JSON Patch. También tiene API
Resumen de GN⁺
- JSON Patch es una herramienta poderosa para realizar actualizaciones parciales de documentos JSON de manera eficiente.
- Aunque puede haber dificultades al trabajar con estructuras JSON complejas, esto se puede superar con diversas bibliotecas y herramientas.
- JSON Patch es útil para reducir la cantidad de datos transferidos y mejorar el rendimiento de las aplicaciones web.
- También se pueden considerar alternativas como JSON Merge Patch, y el uso de JSON Patch en el desarrollo de APIs puede aumentar la eficiencia.
1 comentarios
Comentarios de Hacker News
JSON Patch está diseñado para modificar cualquier documento JSON, por lo que se siente complejo. Si limitas un poco el conjunto de datos, puedes aplicar parches al documento de forma mucho más simple. Por ejemplo, en Firebase no se pueden almacenar valores
null, y establecer algo ennullsignifica eliminarlo. Este tipo de restricción simple permite implementar PATCH fácilmente. Es una gran característica de la API que no tengas que aprender nada nuevo aparte de que "nullsignifica eliminar".Usar
/como separador en JSON es una elección extraña. Como JSON es un subconjunto de JS, esperaba.como separador. Al ver/, parece una especificación escrita por gente de backend, como si quisieran convertir las rutas en URLs para resolver la ambigüedad entre rutas relativas y absolutas.Creo que las rutas deberían ser arreglos y no cadenas. De lo contrario, tienes que escapar
/en las claves y además analizar la cadena de la ruta. Eso hace imposible manejar documentos JSON arbitrarios.Usé JSON Patch una vez como un hack para resolver rápidamente un problema inesperado. Habíamos construido una interfaz web para que contratistas en el extranjero pudieran anotar datos de texto a nivel de palabra. Se suponía que los datos se anotarían en fragmentos pequeños, pero terminaron asignándose documentos completos y las anotaciones no se guardaban. Descubrí JSON Patch y modifiqué el código de carga para que usara solo parches.
Hace falta una sintaxis estándar en la forma de especificar rutas de JSON Patch que permita seleccionar elementos de un arreglo mediante pares clave-valor identificadores en lugar de índices. Esto es especialmente importante al agregar elementos o al analizar diferencias entre elementos JSON de una versión anterior.
Una de las fortalezas de JSON Patch es la idempotencia. Las operaciones de JSON Patch pueden reintentarse de forma segura sin efectos secundarios no deseados. Sin embargo, me sorprendió que no se puedan agregar elementos a un arreglo.
Funciona de manera similar a las consultas de actualización de MongoDB. Me pregunto si se puede usar el lenguaje de actualización sin ejecutar todo MongoDB sobre archivos locales.
Hace falta una comparación entre JSONDiffpatch y JSON Patch. JSONDiffpatch funciona bien en navegador y en Node/Cloudflare Workers, entre otros.
Me costó convencer a socios externos de que aprendieran JSON Patch. Lo usamos en una API orientada a clientes y tuvimos que dedicar mucho esfuerzo para que los usuarios lo entendieran y lo adoptaran.
La especificación de JSON Pointer se siente muy "URL-y", como si permitiera saltarse una sintaxis meta-JSON.
testycopyson propios de la especificación de JSON Patch, y también es posible hacer una "transacción" que ejecute varias ediciones a la vez.