Estoy tratando de descubrir la mejor manera de parchear una colección de objetos. Estoy tratando de cambiar el orden de clasificación de varios objetos y estaba pensando que jsonpatch puede ser el enfoque correcto. Mi objeto se parece a:
[ { "ID": "100", "FirstName": "John", "LastName": "Smith", "Email": "jsmith@test.com", "SortOrder": 1 }, { "ID": "125", "FirstName": "John", "LastName": "Doe", "Email": "jdoe@test.com", "SortOrder": 3 }, { "ID": "50", "FirstName": "james", "LastName": "johnson", "Email": "jjohnson@test.com", "SortOrder": 2 }, ]
Creé un punto final que permite que una solicitud de parche actualice varios objetos en la colección usando una solicitud jsonpatch como esta:
[ { "op": "replace", "path": "/1/SortOrder", "value": 2 }, { "op": "replace", "path": "/0/SortOrder", "value": 1 }, { "op": "replace", "path": "/2/SortOrder", "value": 3 } ]
Lo que quiero poder hacer es usar la propiedad ID en la ruta jsonpatch. ¿Es eso posible con mi estructura de objeto actual? Se vería algo como:
[ { "op": "replace", "path": "/125/SortOrder", "value": 2 }, { "op": "replace", "path": "/100/SortOrder", "value": 1 }, { "op": "replace", "path": "/50/SortOrder", "value": 3 } ]
¿Qué tendría que hacer para poder hacer una solicitud de parche como esta?
Basado en el puntero Json RFC , no hay forma de seleccionar un elemento de una matriz por alguna propiedad. Dado que JSON Patch usa JSON Pointer, no tiene suerte.
Es una lástima que la gente de JSON Patch no haya seleccionado JSON Path , o algo similar, para el idioma de selección.
prueba esta función:
export function generateJsonPatch(obj: Object, patchObject = [], parent: string = null): Object[] { for (const key in obj) { if (obj.hasOwnProperty(key)) { if (obj[key] instanceof Object) { if (parent) { parent = parent + '/' + key; } else { parent = key; } generateJsonPatch(obj[key], patchObject, parent); } else if (obj[key]) { let fieldName; if (parent) { fieldName = parent + '/' + key; } else { fieldName = key; } const patchField = { op: 'replace', path: `/${fieldName}`, value: `${obj[key]}` }; patchObject.push(patchField); } } } return patchObject; } // USAGE: const test = { 'a': '1', 'b': '2', 'c': [{ 'd': '4', 'e': '5' }] }; generateJsonPatch(test); // it will generate // [{ "op": "replace", "path": "/a", "value": "1" }, // { "op": "replace", "path": "/b", "value": "2" }, // { "op": "replace", "path": "/c/0/d", "value": "4" }, // { "op": "replace", "path": "/c/1/e", "value": "5" }]