使用JSON Merge Patch规范,有没有办法识别目标中子集合的成员 - 进行修改或删除?
经过扭转,该键
可能会被标记为readOnly
!
例如,给定以下原始 JSON 文档:
{
"a": "b",
"c": [
{
"key": "d",
"prop1": "e",
"prop2": "f"
},
{
"key": "g",
"prop": "h"
}
]
}
我的直觉(通常是错误的)告诉我发送以下请求:
PATCH /target HTTP/1.1
"c": [
{
"key": "d",
"prop1": "z"
},
]
获取结果:
{
"a": "b",
"c": [
{
"key": "d",
"prop1": "z",
"prop2": "f"
}
]
}
到目前为止,根据规范,这有意义吗?
但是,如果 key
在 OpenAPI 架构中被标记为 readOnly
会怎样?在这种情况下,从技术上讲,我们不应该被允许在线路上传递 key
(UUID)。
最佳答案
看起来这不是它的工作原理。我已经使用 json-merge patch 测试了您的场景,JSON 合并补丁 RFC 7396 的实现,
var jsonmergepatch = require('json-merge-patch');
var source = {
"a": "b",
"c": [
{
"key": "d",
"prop1": "e",
"prop2": "f"
},
{
"key": "g",
"prop": "h"
}
]
};
var patch = {
"c": [
{
"key": "d",
"prop1": "z"
},
]
};
var target = jsonmergepatch.apply(source, patch);
console.log(JSON.stringify(target));
输出:
{ "a": "b", "c": [{ "key": "d", "prop1": "z" } ] }
我的解释是,为c
指定的补丁值不是对象而是数组,因此现有值被完全替换。当查看RFC 7396时(它废弃了 RFC 7386)我们在伪代码中找到了合并补丁的应用:
define MergePatch(Target, Patch):
if Patch is an Object:
if Target is not an Object:
Target = {} # Ignore the contents and set it to an empty Object
for each Name/Value pair in Patch:
if Value is null:
if Name exists in Target:
remove the Name/Value pair from Target
else:
Target[Name] = MergePatch(Target[Name], Value)
return Target
else:
return Patch
我的结论是,数组没有名称-值对,因此不会进入递归处理,而是简单地返回,这意味着在您的情况下会被补丁值替换。
关于readOnly
标志,我坚信合并补丁操作不是架构感知的。 RFC 没有提及这方面的任何内容。
关于json - 使用 JSON Merge Patch,如何引用子集合的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64595512/