【问题标题】:jsonpatch path to update array object by object ID通过对象 ID 更新数组对象的 jsonpatch 路径
【发布时间】:2017-08-17 23:21:28
【问题描述】:

我正在尝试找出修补对象集合的最佳方法。我正在尝试更改许多对象的排序顺序,并且认为 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
  },
]

我创建了一个端点,它允许补丁请求使用 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
  }
]

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

【问题讨论】:

  • 我认为做我所要求的唯一方法是使用字典而不是数组。我现在遇到的问题是我的键值是一个 guid,而且 .NET 中的 jsonpatch 实现似乎不是 guid 键的粉丝。
  • 如果这有帮助 -> 我在请求 URL 中传递我的对象的 ID,然后对从该 ID 检索到的对象应用 PATCH。

标签: c# json asp.net-web-api json-patch


【解决方案1】:

基于Json pointer RFC,无法通过某些属性从数组中选择元素。由于 JSON Patch 使用 JSON 指针,所以你运气不好。

JSON 补丁人员没有选择 JSON Path 或类似的东西作为选择语言,这太糟糕了。

【讨论】:

  • 我不认为这是正确的。我意识到 JSON Patch 规范中没有给出数组索引的示例,但 JSON Pointer RFC 确实提到了数组值。
【解决方案2】:

试试这个功能:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 2019-08-29
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多