【问题标题】:interpretation of the JSON Patch specJSON补丁规范的解释
【发布时间】:2013-04-02 13:40:39
【问题描述】:

我对 JSON Patch (RFC 6902) 的解释有疑问。

假设我有一个如下所示的资源:

{
   "type": "assembly",
   "uri": "http://example.com/campSrv/Assembly/18",
   "name": "/sample",
   "description": "Hello, World Application",
   "created": "2013-03-27T16:15Z",
   ...
}

这个资源的定义说它可以有一个名为“tags”的值,它被定义为一个字符串数组。但是,这个资源目前没有标签,所以我的服务不会序列化不存在的数组。

现在假设我提交了以下 HTTP PATCH 请求:

PATCH http://example.com/campSrv/Assembly/18 HTTP/1.1
Content-Type: application/json-patch

[
  { "op": "add", "path": "/tags/0", "value": "flobbit" }
]

这应该创建“tags”数组并添加“flobbit”作为第一个/唯一元素还是我的服务器应该返回错误?

【问题讨论】:

    标签: json patch


    【解决方案1】:

    据我了解...

    您的补丁将导致错误,因为tags 不存在,并且您无法添加到尚不存在的数组中。

    RFC 6902 4.1

    ...

    但是,对象本身或包含它的数组确实需要
    存在,如果不是这种情况,它仍然是一个错误。对于
    例如,一个目标位置为“/a/b”的“add”,以此开头 文件:

    { "a": { "foo": 1 } }

    不是错误,因为“a”存在,并且“b”会被添加到它的
    价值。这是本文档中的错误:

    { "q": { "bar": 2 } }

    因为“a”不存在。

    不过,此补丁将添加一个值为"flobbit"tags 字符串。

    [
      { "op": "add", "path": "/tags", "value": "flobbit" }
    ]
    

    这个补丁将添加tags数组,第一个元素是"fobbit"

    [
      { "op": "add", "path": "/tags", "value": ["flobbit"] }
    ]
    

    【讨论】:

    • { "op": "add", "path": "/tags", "value": ["flobbit"] } 在上述情况下,如果 tags 数组已经存在,应该向它添加“flobbit”还是用提供的数组的内容替换整个数组? (与使用操作“替换”相比,如果标签数组不存在,则应该拒绝请求)。 (如果感觉替换整个数组最自然,那么如果要添加多个值,则使用多个操作)
    • 我不确定。但是,我将其解释为“将包含单个元素 'flobbit' 的数组添加到现有数组中”。因此,更新后的 tags 属性将类似于 ["existing value", "existing value2", "etc.", ["flobbit"]]
    • @svidgen 我认为这是不正确的。 RFC6902 为“添加”操作指定了这一点:“如果目标位置指定了一个确实存在的对象成员,则替换该成员的值。” - 然后继续展示如何向现有数组添加一些内容:“添加到现有数组的元素 [...] 如果使用“-”字符来索引数组的末尾(参见 [RFC6901] ),这具有将值附加到数组的效果”所以补丁应该看起来像 { "op": "add", "path": "/tags/-", "value": "flobbit" } 如果你想要将元素“flobbit”添加到现有数组中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多