【问题标题】: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 提到了以下行为,但我不确定它是否与此处相关。

如果从数组中删除一个元素,则任何高于 指定的索引向左移动一位。

【问题讨论】:

    标签: json-patch


    【解决方案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 的链接失效,读者仍然可以获得有关适用标准文档的信息,并且他们很容易使用这些信息来查找更多信息。
    猜你喜欢
    • 1970-01-01
    • 2014-03-08
    • 2017-05-28
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多