json - 使用 JSON Merge Patch,如何引用子集合的成员?

标签 json merge json-patch

使用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/

相关文章:

java - 为什么在 Spring 中,对于内容类型为 json-patch 的请求,日期转换不起作用?

api - FluentValidator 和 JsonPatchDocument

java - 在没有存储库的情况下修改 Spring Data Rest 中的 @OneToMany 实体

php - 有什么方法可以将表单从我的服务器提交到 Google Apps 脚本 (.gs) 文件

json - Spring Boot中的角色基础Json输出

javascript - 将 JSON .get 结果简单存储在数组中?

ios - 核心数据-后台线程中的更新实体会自动更改主线程中的 NSManagedObject 而无需合并-为什么?

python - 合并多个文件 : 1st Column (same string), 第二列(每个文件的唯一值)

mysql - GWT JSON & MySQL

algorithm - 为什么 Merge Sort 的 Merge() 函数有条件第二个循环?