从数组中删除元素的 JSON 补丁格式是啥?
Posted
技术标签:
【中文标题】从数组中删除元素的 JSON 补丁格式是啥?【英文标题】:What is the JSON Patch format to remove an element from an array?从数组中删除元素的 JSON 补丁格式是什么? 【发布时间】:2015-02-10 22:45:36 【问题描述】:我有以下 JSON 文档,我想从中删除“roles”字段的数组值中的“roleId2”元素:
"id" : 12345,
"firstName": "SomeFirstName",
"lastName": "SomeLastName",
"roles":["roleId1", "roleId2", "roleId3"]
如何编写 JSON Patch 文档来删除该元素?下面的表达式有效吗?
"op": "remove", "path":"/roles", "value": "roleId2"
或者,应该是这个样子(因为文档中的“roles”值是一个数组)?
"op": "remove", "path":"/roles", "value": ["roleId2"]
通过阅读RFC 6902,我不清楚哪个(如果有的话)是正确的。 RFC 提到了以下行为,但我不确定它是否与此处相关。
如果从数组中删除一个元素,则任何高于 指定的索引向左移动一位。
【问题讨论】:
【参考方案1】:从数组中删除索引 1 处的项目的正确补丁是:
"op": "remove", "path": "/roles/1"
查看JSFiddle 的工作示例(使用Fast-JSON-Patch)
【讨论】:
是的,我认为这会奏效。但是,您能否验证以下对我的理解是否正确? 如果有人想从数组中删除多个元素,他们必须在补丁数组中提供多个删除操作。 是的。要查看 JSON Patch 的更多使用示例,您可以研究此 repo:github.com/json-patch/json-patch-tests。它有 84 项测试,显示几乎所有可能的补丁 我认为这是一个非常糟糕的解决方案,因为当另一个客户端刚刚删除“roleId1”时会发生什么?然后你会无意中删除“roleId3”而不是“roleId2”。您可以通过在之前添加显式测试操作来解决此问题,但理想情况下,默认情况应该更安全,并且理想情况下,即使索引已更改,您也希望(在许多情况下至少)补丁成功,但值仍然可以被删除。 @warpech :有没有一种方法可以使用对象的值名称而不是索引来删除?因为在我的情况下,对象是在 backed 中创建的,我不知道它的索引。 @Niranjan:关于删除值,它需要完全不同的语法。可能是这样的:"op": "remove-value", "path": "/roles", "value": "roleId2"
这样“roleId2”就可以被删除,而不管它的索引如何。您甚至可以考虑删除一个不存在的值以始终成功,这样当两个客户端同时尝试删除同一个角色时,他们都会得到成功响应。【参考方案2】:
RFC 6902 不支持此功能。一个possibile revision to the JSON-Patch format正在讨论中,可能支持value-based array operations。
【讨论】:
@Nick It 是一个答案。答案是“不支持,但正在作为修订版进行讨论”。另外,即使链接失效,帖子中也有足够的信息供人们查找更多信息 - 例如,您可以只用 Google 搜索“RFC 6902”。 @Nick 可以找到仅链接答案的官方标准here。这个是的答案,因为即使链接“失效”,它也有可供读者继续阅读的信息。即使指向 RFC 6902 的链接失效,读者仍然可以获得有关适用标准文档的信息,并且他们很容易使用这些信息来查找更多信息。以上是关于从数组中删除元素的 JSON 补丁格式是啥?的主要内容,如果未能解决你的问题,请参考以下文章