通过对象ID更新数组对象的jsonpatch路径

问题描述 投票:0回答:3

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

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

c# json asp.net-web-api json-patch
3个回答
31
投票

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

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


0
投票

您可以避免使用数组,而只依赖 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 数组中的排序,您可以引入新字段“位置”或“索引”或任何您喜欢的字段来保持排序。


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

© www.soinside.com 2019 - 2024. All rights reserved.