JSON补丁规范的解释

JSON补丁规范的解释,json,patch,Json,Patch,我对JSON补丁()的解释有一个问题 假设我有这样一个资源: { "type": "assembly", "uri": "http://example.com/campSrv/Assembly/18", "name": "/sample", "description": "Hello, World Application", "created": "2013-03-27T16:15Z", ... } 该资源的定义是,它可以有一个名为“tags”的值,该值被定

我对JSON补丁()的解释有一个问题

假设我有这样一个资源:

{
   "type": "assembly",
   "uri": "http://example.com/campSrv/Assembly/18",
   "name": "/sample",
   "description": "Hello, World Application",
   "created": "2013-03-27T16:15Z",
   ...
}
该资源的定义是,它可以有一个名为“tags”的值,该值被定义为字符串数组。但是,此资源当前没有标记,因此我的服务不会序列化不存在的数组

现在,假设我提交以下HTTP修补程序请求:

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

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

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

据我所知

您的修补程序将导致错误,因为
标记
不存在,并且您无法添加到尚未存在的数组中

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

{“a”:{“foo”:1}

不是错误,因为“a”存在,而“b”将添加到其
价值这是本文档中的一个错误:

{“q”:{“bar”:2}

因为“a”不存在

但是,此修补程序将添加一个值为
“flobbit”
标记
字符串

此修补程序将添加
标记
数组,第一个元素是
“fobbit”


{“op”:“add”,“path”:“/tags”,“value”:[“flobbit”]}
在上述情况下,如果tags数组已经存在,应该向其添加“flobbit”还是用提供的数组的内容替换整个数组?(与使用op“replace”相比,如果标签数组不存在,则应拒绝请求)。(如果替换整个数组感觉最自然,那么如果要添加多个值,则使用多个操作)我不太清楚。但是,我会将其解释为“将包含单个元素的数组添加到现有数组中”。因此,更新的
标记将类似于,
[“现有值”、“现有值2”、“等”,[“flobbit”]
@svidgen我认为这是错误的。RFC6902为“添加”操作指定了这一点:“如果目标位置指定了一个确实存在的对象成员,则该成员的值将被替换。”-然后,它将展示如何向现有数组添加内容:“要添加到现有数组的元素[…],如果使用“-”字符对数组的结尾进行索引(请参见[RFC6901]),其效果是将值附加到数组“因此,如果要将元素“flobbit”添加到现有数组中,则修补程序应类似于{“op”:“add”,“path”:“/tags/-”,“value”:“flobbit”}。
[
  { "op": "add", "path": "/tags", "value": "flobbit" }
]
[
  { "op": "add", "path": "/tags", "value": ["flobbit"] }
]