我正在尝试找出修补对象集合的最佳方法。我正在尝试更改多个对象的排序顺序,并且认为 jsonpatch 可能是正确的方法。我的对象看起来像:
[
{
"ID": "100",
"FirstName": "John",
"LastName": "Smith",
"Email": "[email protected]",
"SortOrder": 1
},
{
"ID": "125",
"FirstName": "John",
"LastName": "Doe",
"Email": "[email protected]",
"SortOrder": 3
},
{
"ID": "50",
"FirstName": "james",
"LastName": "johnson",
"Email": "[email protected]",
"SortOrder": 2
},
]
我创建了一个端点,允许补丁请求使用 jsonpatch 请求更新集合中的多个对象,如下所示:
[
{
"op": "replace",
"path": "/1/SortOrder",
"value": 2
},
{
"op": "replace",
"path": "/0/SortOrder",
"value": 1
},
{
"op": "replace",
"path": "/2/SortOrder",
"value": 3
}
]
我想要做的是使用 jsonpatch 路径中的 ID 属性。我当前的对象结构可能吗?它看起来像:
[
{
"op": "replace",
"path": "/125/SortOrder",
"value": 2
},
{
"op": "replace",
"path": "/100/SortOrder",
"value": 1
},
{
"op": "replace",
"path": "/50/SortOrder",
"value": 3
}
]
我需要做什么才能发出这样的补丁请求?
基于 Json 指针 RFC,无法通过某些属性从数组中选择元素。由于 JSON Patch 使用 JSON 指针,所以你运气不好。
JSON Patch 人员没有选择 JSON Path 或类似的东西作为选择语言,这太糟糕了。
您可以避免使用数组,而只依赖 JSON 对象。这并不完全理想,但你仍然可以很好地依赖 jsonpointers。
因此您的原始文档将更改为如下所示:
{
"100": {
"ID": "100",
"FirstName": "John",
"LastName": "Smith",
"Email": "[email protected]",
"SortOrder": 1
},
"125": {
"ID": "125",
"FirstName": "John",
"LastName": "Doe",
"Email": "[email protected]",
"SortOrder": 3
},
"50": {
"ID": "50",
"FirstName": "james",
"LastName": "johnson",
"Email": "[email protected]",
"SortOrder": 2
}
}
那么您的 JSON PATCH 有效负载可能如下所示:
[
{
"op": "replace",
"path": "/125/SortOrder",
"value": 2
},
{
"op": "replace",
"path": "/100/SortOrder",
"value": 1
},
{
"op": "replace",
"path": "/50/SortOrder",
"value": 3
}
]
如果您关心 JSON 数组中的排序,您可以引入新字段“位置”或“索引”或任何您喜欢的字段来保持排序。
试试这个功能:
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" }]