如何在JSON Patch RFC中转义的波形符号应该运行?

时间:2014-06-25 22:05:28

标签: json patch json-patch rfc6902

引用http://tools.ietf.org/html/rfc6902#appendix-A.14

  

A.14。 〜逃避订购

     

示例目标JSON文档:

{
  "/": 9,
  "~1": 10
}
     

JSON补丁文档:

[
  {"op": "test", "path": "/~01", "value": 10}
]
     

生成的JSON文档:

{
  "/": 9,
  "~1": 10
}

我正在撰写此RFC的实现,而且我坚持这一点。这是什么尝试实现的,它应该如何运作?

假设第一部分的答案是"允许引用包含/ s的json密钥名称,"你会怎么做?

3 个答案:

答案 0 :(得分:1)

我认为RFC中提供的示例并不是最精确的考虑因素,尤其是它试图仅通过示例来记录某个功能,这种情况最多也是模糊的 - 没有提供任何类型的评论。

您可能对以下文件中提供的口译感兴趣:

这些看似非常相似,我认为这是由于Rackspace和OpenStack之间关系的本质:

  
    

OpenStack于2010年开始作为Rackspace Hosting和NASA(...)的联合项目

  

它实际上提供了一些有用的细节,包括它接受的语法和引入这些令牌的理由,而不是RFC本身。

编辑:似乎JSON指针有单独的RFC 6901,可用here,上面的OpenStack和Rackspace规范与之一致。

答案 1 :(得分:1)

~0扩展为~,因此/~01扩展为/~1

猜测他们意味着你不应该"双重扩展"因此,展开的/~1不应再次展开为//,因此不得与文档"/"键匹配(如果您展开双倍会发生这种情况)。您也不应该在源文档中扩展文字,因此"~1"键实际上与扩展的"/"不同。但我重复这是我的猜测关于这个例子的意图,真实意图可能会有所不同。

该示例确实非常糟糕,特别是因为它使用"test"操作并且没有指定该操作的结果。其他例子如A.15的下一个例子至少说它的测试操作必须失败,A.14不会告诉你操作是否应该成功。我假设它们意味着操作应该成功,因此暗示/~01应该与"~1"键匹配。这可能就是那个例子。

如果我要编写一个实现,我可能不会过多担心这个例子,只是看看其他实现是做什么的 - 检查我是否与它们兼容。寻找其他项目的测试套件也是一个好主意,例如我在http://jsonpatch.com/ https://github.com/json-patch/json-patch-tests找到了一个<{3}}

答案 2 :(得分:0)

~字符是JSON指针中的关键字。因此,我们需要将其“编码”为~0。引用jsonpatch.com

  

如果您需要用键名中的〜或/来引用键,则必须分别对〜0和〜1进行转义。例如,要从{“ foo / bar〜”:“ baz”}获取“ baz”,您可以使用指针/ foo〜1bar〜0

基本上,

[
  {"op": "test", "path": "/~01", "value": 10}
]

解码后的收益率

[
  {"op": "test", "path": "/~1", "value": 10}
]