JSON补丁:通过对象ID更新数组对象的路径

19

我正在尝试找出对集合对象进行修补的最佳方法。我想改变一些对象的排序顺序,并认为jsonpatch可能是正确的方法。我的对象看起来像:

[
  {
    "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
  },
]
我创建了一个端点,允许使用像这样的JSON补丁请求更新集合中的多个对象:
[
  {
    "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
  }
]

我需要做什么才能像这样发出一个补丁请求?


我认为实现我所要求的唯一方法是使用字典而不是数组。我现在遇到的问题是,我的键值是一个GUID,而在.NET中的jsonpatch实现似乎不喜欢GUID键。 - JoAMoS
这个回答解决了你的问题吗?使用JSON指针按名称选择数组成员 - HairOfTheDog
如果有帮助的话 -> 我在请求URL中传递我的对象的ID,然后对从该ID检索到的对象应用PATCH。 - rakesh sinha
2个回答

29

根据Json Pointer RFC,没有办法通过某个属性从数组中选择元素。因为JSON Patch使用JSON Pointer,所以你没那么幸运。

很遗憾,JSON Patch的开发者们没有选择JSON Path或其他类似的语言作为选择语言。


我认为这不正确。我意识到JSON Patch规范中没有给出数组索引的示例,但是JSON Pointer RFC确实提到了数组值。 - Amala
根据https://github.com/json-patch/json-patch2/issues/12问题,JSON Patch仅支持基于索引的修补,而不支持字典属性或查询参数的修补。 - mbigras

-3

尝试使用这个函数:

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" }]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接