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./fooapunta al valor de la clave "foo"./foo/0apunta al primer elemento del array "foo".~1se utiliza para representar una/literal.~0se 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
- Formateador y Validador JSON - Úselo para validar sus documentos Patch o Merge Patch.
- Convertidor de JSON a CSV - Aplane sus datos JSON para su análisis.