从阵列中删除元素的JSON Patch格式是什么?

Nir*_*jan 11 json-patch

我有以下JSON文档,我想从中删除"roles"字段的数组值中的"roleId2"元素:

{
  "id" : 12345,
  "firstName": "SomeFirstName",
  "lastName": "SomeLastName",
  "roles":["roleId1", "roleId2", "roleId3"]
}
Run Code Online (Sandbox Code Playgroud)

如何编写JSON补丁文档来删除该元素?以下表达式是否有效?

{"op": "remove", "path":"/roles", "value": "roleId2"}
Run Code Online (Sandbox Code Playgroud)

或者,它应该是这样的(因为文档中的"角色"值是一个数组)?

{"op": "remove", "path":"/roles", "value": ["roleId2"]}
Run Code Online (Sandbox Code Playgroud)

从阅读RFC 6902,我不清楚哪一个 - 如果 - 是正确的.RFC提到了以下行为,但我不确定它是否与此相关.

如果从数组中删除元素,则指定索引上方的任何元素都会向左移动一个位置.

war*_*ech 9

从数组中删除索引1处的项的正确补丁是:

{"op": "remove", "path": "/roles/1"}
Run Code Online (Sandbox Code Playgroud)

请参阅JSFiddle的工作示例(使用Fast-JSON-Patch)

  • 我认为这是一个非常糟糕的解决方案,因为当另一个客户刚刚删除"roleId1"时会发生什么?然后你无意中将删除"roleId3"而不是"roleId2".您可以通过之前添加显式测试操作来解决此问题,但理想情况下,默认情况应该更安全,理想情况下,即使索引已更改,您也希望(在许多情况下至少)补丁成功,但值仍然可以被删除. (24认同)

Pet*_*ard 9

这不受RFC 6902支持。甲不可能性修订的JSON贴片格式正被讨论的,其可以支持基于值的阵列操作

  • @PetrÚjezdský A.4 节讨论“基于索引的操作”(即删除第二个元素,无论其值如何)。这个问题和这个答案讨论了“基于值的操作”(即在不知道其索引的情况下删除特定值)。当然,正如您正确指出的那样,基于索引的操作是可能的。 (2认同)