json rfc rfc6901 rfc6902 rfc7396 api-design standards

Guía de Estándares JSON: RFC 6901 (Pointer), 6902 (Patch) y 7396 (Merge Patch)

Domine los estándares de manipulación JSON. Entienda cómo RFC 6901, RFC 6902 y RFC 7396 proporcionan formas estándar de señalar y modificar datos JSON.

2026-04-11

Guía de Estándares JSON: RFC 6901, 6902 y 7396

JSON se ha convertido en el estándar de facto para el intercambio de datos en la web. Sin embargo, a medida que las API se vuelven más complejas, los objetos JSON simples a menudo no son suficientes. Los desarrolladores necesitan formas estandarizadas de hacer referencia a partes específicas de un documento JSON y de describir los cambios en esos documentos. Aquí es donde entran en juego RFC 6901 (JSON Pointer), RFC 6902 (JSON Patch) y RFC 7396 (JSON Merge Patch).

¿Qué son JSON Pointer y Patch?

  • RFC 6901 (JSON Pointer): Define una sintaxis de cadena para identificar un valor específico dentro de un documento JSON. Es como una "dirección" para un dato.
  • RFC 6902 (JSON Patch): Define una estructura de documento JSON para expresar una secuencia de operaciones que se aplicarán a un documento JSON. Es como un "diff" o un "registro de transacciones".
  • RFC 7396 (JSON Merge Patch): Proporciona una forma más sencilla de describir cambios enviando un documento de "parche" que se parece al documento de destino pero solo contiene los campos modificados.

1. RFC 6901: JSON Pointer

JSON Pointer utiliza una sintaxis separada por barras diagonales (/) para navegar a través de la jerarquía de un objeto JSON.

Reglas de sintaxis:

  • / representa la raíz.
  • /foo apunta al valor de la clave "foo".
  • /foo/0 apunta al primer elemento del array "foo".
  • ~1 se utiliza para representar una / literal.
  • ~0 se utiliza para representar una ~ literal.

Ejemplo:

{
  "biscuits": [
    { "name": "Digestive" },
    { "name": "Choco" }
  ]
}

El puntero /biscuits/1/name se resolvería como "Choco".

2. RFC 6902: JSON Patch

JSON Patch es un array de objetos de operación. Cada objeto debe tener un campo op.

Operaciones:

  • add: Añade un valor en la ruta especificada.
  • remove: Elimina el valor en la ruta.
  • replace: Reemplaza el valor en la ruta.
  • move: Mueve un valor de una ruta a otra.
  • copy: Copia un valor de una ruta a otra.
  • test: Prueba que un valor en una ruta sea el esperado.

Ejemplo de parche:

[
  { "op": "replace", "path": "/biscuits/0/name", "value": "Oatmeal" },
  { "op": "add", "path": "/biscuits/-", "value": { "name": "Ginger" } }
]

El - en /biscuits/- significa "el final del array".

3. RFC 7396: JSON Merge Patch

JSON Merge Patch es mucho más simple que RFC 6902. Simplemente envía un objeto JSON que representa el estado final deseado de los campos que desea cambiar.

Reglas:

  • Si el parche contiene un campo con un valor no nulo, ese campo se actualiza o se añade.
  • Si el parche contiene un campo con un valor null, ese campo se elimina del destino.
  • No es adecuado para parchear arrays (reemplaza todo el array).

Ejemplo:

Destino:

{ "a": "b", "c": "d" }

Parche:

{ "a": "z", "c": null, "e": "f" }

Resultado:

{ "a": "z", "e": "f" }

Comparación: Patch vs. Merge Patch

Característica RFC 6902 (Patch) RFC 7396 (Merge Patch)
Complejidad Alta (Array de operaciones) Baja (Basado en objetos)
Eficiencia Muy alta (Quirúrgico) Moderada (A nivel de campo)
Soporte de Arrays Soporte completo Pobre (Reemplaza todo el array)
Operaciones Atómicas Sí (opción test) No
Ideal para Cambios de estado complejos Actualizaciones simples de propiedades

Preguntas frecuentes FAQ

P: ¿Cuál debería usar para mi API? R: Use JSON Merge Patch (7396) para actualizaciones de recursos simples donde no le importe la manipulación precisa de arrays. Use JSON Patch (6902) para recursos complejos, requisitos de alto rendimiento o cuando necesite operaciones atómicas de "probar y establecer".

P: ¿Puedo usar JSON Pointer en mi URL? R: Sí, es común usar JSON Pointers en fragmentos de URI (por ejemplo, example.com/schema.json#/definitions/user).

P: ¿Cómo manejo los caracteres especiales en las claves? R: Use ~1 para / y ~0 para ~. Por ejemplo, una clave llamada a/b se referencia como /a~1b.

Herramientas relacionadas