互联网工程任务组 G. Luff
互联网草案
预期状态:信息性 H. Andrews,编辑
过期时间:2018 年 7 月 23 日 Cloudflare, Inc.
2018 年 1 月 19 日

相对 JSON 指针
draft-handrews-relative-json-pointer-01

摘要

JSON 指针是一种用于指定 JSON 文档中位置的语法,从文档根开始。本文档定义了 JSON 指针语法的扩展,允许从文档内部指定相对位置。

本备忘录的状态

本互联网草案完全符合 BCP 78 和 BCP 79 的规定。

互联网草案是互联网工程任务组 (IETF) 的工作文档。请注意,其他团体也可能以互联网草案的形式分发工作文档。当前互联网草案的列表位于 http://datatracker.ietf.org/drafts/current/。

互联网草案是有效期最长为六个月的草案文件,可能随时更新、替换或被其他文件废弃。将互联网草案用作参考材料或引用它们(除“正在进行的工作”以外)是不合适的。

本互联网草案将于 2018 年 7 月 23 日过期。

版权声明

版权所有 (c) 2018 IETF 信托和被识别为文档作者的人员。保留所有权利。

本文件受 BCP 78 和 IETF 信托的《关于 IETF 文档的法律条款》(http://trustee.ietf.org/license-info)的约束,该条款在发布本文件之日生效。请仔细阅读这些文件,因为它们描述了您关于本文件的权利和限制。从本文档中提取的代码组件必须包含简化 BSD 许可证文本(如信托法律条款第 4.e 节所述),并按简化 BSD 许可证所述提供,不提供任何担保。


目录

1. 简介

JSON 指针 (RFC 6901 [RFC6901]) 是一种用于指定 JSON 文档中位置的语法,从文档根开始。本文档定义了一种相关语法,允许识别文档内部的相对位置。

2. 约定和术语

本文档中的关键词“必须”、“不得”、“需要”、“应该”、“不应该”、“建议”、“可以”和“可选”的解释如 RFC 2119 [RFC2119] 中所述。

3. 语法

相对 JSON 指针是一个 Unicode 字符串(参见 RFC 4627,第 3 节 [RFC4627]),包含一个非负整数,后跟一个 '#' (%x23) 字符或一个 JSON 指针 (RFC 6901 [RFC6901] )。

整数前缀和 JSON 指针之间的分隔始终是明确的,因为 JSON 指针必须为零长度或以 '/' (%x2F) 开头。同样,JSON 指针永远不会与 '#' 模糊。

相对 JSON 指针的 ABNF 语法为

   relative-json-pointer =  non-negative-integer <json-pointer>
   relative-json-pointer =/ non-negative-integer "#"
   non-negative-integer      =  %x30 / %x31-39 *( %x30-39 )
           ; "0", or digits without a leading "0"

                

其中 <json-pointer> 遵循 RFC 6901,第 3 节 [RFC6901] (“语法”) 中定义的生成式。

4. 评估

相对 JSON 指针的评估从 JSON 文档中一个值的引用开始,并以该文档中的一个值、对应于对象成员的字符串或表示数组索引的整数结束。

评估首先处理非负整数前缀。这可以通过获取从字符串开头开始的最长的连续十进制数字序列来找到,取其十进制数值。如果该值大于零,则重复以下步骤该次数:RFC 6901,第 4 节 [RFC6901] (“评估”),修改为使用当前持有的引用作为初始引用(它可能不是文档的根)。

如果相对 JSON 指针的剩余部分是 JSON 指针,则评估继续进行如下

否则(当相对 JSON 指针的剩余部分是字符 '#' 时),最终结果如下确定

5. JSON 字符串表示

围绕相对 JSON 指针的 JSON 字符串表示的关注点与 RFC 6901,第 5 节 [RFC6901] 中列出的关注点相同。

5.1. 示例

例如,给定 JSON 文档

                      {
                         "foo": ["bar", "baz"],
                         "highly": {
                            "nested": {
                               "objects": true
                            }
                         }
                      }

                    

从值“baz”(在“foo”内)开始,以下 JSON 字符串评估为相应的值

                  "0"                         "baz"
                  "1/0"                       "bar"
                  "2/highly/nested/objects"   true
                  "0#"                        1
                  "1#"                        "foo"

                    

从值 {"objects":true} (对应于成员键“nested”)开始,以下 JSON 字符串评估为相应的值

                "0/objects"                 true
                "1/nested/objects"          true
                "2/foo/0"                   "bar"
                "0#"                        "nested"
                "1#"                        "highly"

                    

6. 不应用于 URI 片段标识符

与 JSON 指针不同,相对 JSON 指针不能用于 URI 片段标识符。这些片段指定了文档中的确切位置,因此相对 JSON 指针不适合。

7. 错误处理

在发生错误情况下,JSON 指针的评估无法完成。

评估可能会因语法无效或引用不存在的值而失败。本规范未定义如何处理错误。JSON 相对指针的应用程序应该指定每种错误类型的影響和处理方式。

8. 与 JSON 指针的关系

相对 JSON 指针旨在作为 JSON 指针的补充。应用程序必须分别指定每种语法的使用。将 JSON 指针或相对 JSON 指针定义为可接受的语法并不意味着另一种语法也是可接受的。

9. 致谢

本规范的语言和结构在很大程度上基于 [RFC6901],有时直接引用它。

这份草案主要保留了 Geraint Luff 撰写和发布的内容,只是在新的编辑下进行了一些小的后续更改。

10. 安全注意事项

不能保证给定相对 JSON 指针的评估会引用实际的 JSON 值。使用相对 JSON 指针的应用程序应通过定义未解析的指针的处理方式来预期这种情况。

作为处理的一部分,可能会从多个 JSON 文档(部分或全部)中组装一个复合数据结构。在这种情况下,应用程序应该确保相对 JSON 指针不会评估为该文档之外的值,该文档是为其编写的。

请注意,JSON 指针可以包含 NUL(Unicode U+0000)字符。在使用 NUL 标记字符串结尾的编程语言中,需要小心,不要误解此字符。

11. 参考文献

11.1. 规范性引用

[RFC2119] Bradner, S.,"用于 RFC 中指示需求级别的关键词",BCP 14,RFC 2119,DOI 10.17487/RFC2119,1997 年 3 月。
[RFC6901] Bryan, P.Zyp, K.M. Nottingham,"JavaScript 对象表示法 (JSON) 指针",RFC 6901,DOI 10.17487/RFC6901,2013 年 4 月。

11.2. 信息性引用

[RFC4627] Crockford, D.,"JavaScript 对象表示法 (JSON) 的 application/json 媒体类型",RFC 4627,DOI 10.17487/RFC4627,2006 年 7 月。

附录 A. 更改日志

[CREF1]离开互联网草案状态之前,应删除此部分。

draft-handrews-relative-json-pointer-01

draft-handrews-relative-json-pointer-00

draft-luff-relative-json-pointer-00

作者地址

Geraint Luff 剑桥, 英国 电子邮件:[email protected]
Henry Andrews (编辑) Cloudflare, Inc. 旧金山, CA 美国 电子邮件:[email protected]