互联网工程任务组 (IETF) T. Bray, Ed.
征求意见稿:7493 Textuality Services
类别:标准跟踪 2015 年 3 月
ISSN: 2070-1721
I-JSON 消息格式
摘要
I-JSON("Internet JSON" 的缩写)是 JSON 的一个受限配置文件,
旨在最大化互操作性,并增强软件能够以可预测结果成功处理它的
信心。
本备忘录状态
本文档是互联网标准跟踪文档。
本文档是互联网工程任务组 (IETF) 的成果。它代表了 IETF 社区的
共识。它已经经过公开评审,并已获互联网工程指导组 (IESG) 批准
发布。有关互联网标准的更多信息,请参见
RFC 5741 第 2 节。
关于本文档当前状态、任何勘误以及如何提供反馈的信息,可通过
http://www.rfc-editor.org/info/rfc7493 获得。
版权声明
版权所有 (c) 2015 IETF Trust 和列为本文档作者的人员。保留所有
权利。
本文档受 BCP 78 以及在本文档发布之日生效的 IETF Trust
与 IETF 文档相关的法律条款
(http://trustee.ietf.org/license-info) 约束。请仔细阅读这些
文档,因为它们描述了你关于本文档的权利与限制。从本文档中提取
的代码组件必须包含 Trust 法律条款第 4.e 节所述的简化 BSD 许可证
文本,并且按简化 BSD 许可证所述不提供任何担保。
Bray 标准跟踪 [第 1 页]
RFC 7493 I-JSON 消息格式 2015 年 3 月
目录
1. 引言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1. 术语 . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. 需求语言 . . . . . . . . . . . . . . . . . . . . . . . . 2
2. I-JSON 消息 . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1. 编码和字符 . . . . . . . . . . . . . . . . . . . . . . 3
2.2. 数字 . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3. 对象约束 . . . . . . . . . . . . . . . . . . . . . . . 3
3. 软件行为 . . . . . . . . . . . . . . . . . . . . . . . . . 4
4. 协议设计建议 . . . . . . . . . . . . . . . . . . . . . . . 4
4.1. 顶层构造 . . . . . . . . . . . . . . . . . . . . . . . 4
4.2. 必须忽略策略 . . . . . . . . . . . . . . . . . . . . . 4
4.3. 时间和日期处理 . . . . . . . . . . . . . . . . . . . . 5
4.4. 二进制数据 . . . . . . . . . . . . . . . . . . . . . . 5
5. 安全考虑事项 . . . . . . . . . . . . . . . . . . . . . . . 5
6. 规范性参考文献 . . . . . . . . . . . . . . . . . . . . . 5
致谢 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
作者地址 . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1. 引言
RFC 7159 描述了 JSON 数据交换格式,该格式在互联网协议中被广泛
使用。由于历史原因,该规范允许使用一些语言习惯用法和文本编码
模式,而这些做法很可能导致互操作性问题和软件故障,尤其是当
接收 JSON 数据的程序使用自动化软件将其映射到原生编程语言结构
或数据库记录时。RFC 7159 描述了可用于避免这些互操作性问题的
实践。
本文档规定了 I-JSON,即 "Internet JSON" 的缩写。定义的单位是
“I-JSON 消息”。I-JSON 消息也是 RFC 7159 中定义的“JSON 文本”,
但带有某些额外约束,用以执行该规范中描述的良好互操作性实践。
1.1. 术语
本文档中的术语 "object"、"member"、"array"、"number"、"name"
和 "string" 应按 RFC 7159 [RFC7159] 中的描述进行解释。
1.2. 需求语言
本文档中的关键词 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、
"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY" 和
"OPTIONAL" 应按 RFC 2119 [RFC2119] 中的描述进行解释。
Bray 标准跟踪 [第 2 页]
RFC 7493 I-JSON 消息格式 2015 年 3 月
2. I-JSON 消息
I-JSON 消息是由 RFC 7159 定义的 JSON 文本。
2.1. 编码和字符
I-JSON 消息 MUST 使用 UTF-8 [RFC3629] 编码。
对象成员名称,以及数组和对象成员中的字符串值,MUST NOT 包含
标识代理项或非字符的码点,相关定义见 [UNICODE]。
这既适用于直接以 UTF-8 编码的字符,也适用于被转义的字符;
因此,"\uDEAD" 是无效的,因为它是未配对的代理项,而
"\uD800\uDEAD" 则是合法的。
2.2. 数字
实现 IEEE 754-2008 binary64(双精度)数字 [IEEE754] 的软件通常
可用并被广泛使用。生成 I-JSON 消息的实现不能假定接收方实现
能够处理比这些数字所提供的范围或精度更大的数值。I-JSON 消息
SHOULD NOT 包含表示超出 IEEE 754 双精度数字所能提供的范围或
精度的数字,例如 1E400 或 3.141592653589793238462643383279。
I-JSON 发送方不能期望接收方将绝对值大于 9007199254740991
(即超出 [-(2**53)+1, (2**53)-1] 范围)的整数视为精确值。
对于需要精确交换具有更大范围或精度的数字的应用,RECOMMENDED
将它们编码为 JSON 字符串值。这要求接收程序理解该值的预期语义。
一个例子是 64 位整数,尽管现代硬件可以处理它们,但由于
JavaScript 数字的范围有限,仍应如此。
2.3. 对象约束
I-JSON 消息中的对象 MUST NOT 具有名称重复的成员。在此上下文中,
"duplicate" 表示在处理任何转义字符之后,名称是相同的 Unicode
字符序列。
Bray 标准跟踪 [第 3 页]
RFC 7493 I-JSON 消息格式 2015 年 3 月
I-JSON 消息中对象成员的顺序不会改变 I-JSON 消息的含义。如果两个
I-JSON 消息仅在对象成员的顺序上不同,接收方实现 MAY 将它们视为
等价。
3. 软件行为
使用 I-JSON 的一个主要优势是,接收方可以避免其接收的 JSON 消息
中存在语义歧义。这使得接收方能够拒绝或以其他方式忽略不符合
本文档中 I-JSON 消息要求的消息。使用 I-JSON 消息的协议可以
写成要求接收方实现拒绝(或者,在安全协议的情况下,不信任)
不满足 I-JSON 约束的消息。
使用 I-JSON 消息的协议设计者 SHOULD 在这种情况下为错误数据的
接收方提供一种向发送方指示问题的方式。
4. 协议设计建议
I-JSON 被设计用于互联网协议。以下建议适用于在这类协议中使用
I-JSON。
4.1. 顶层构造
I-JSON 消息可以是任何 JSON 值。然而,存在一些按照较旧规范
[RFC4627] 编写的软件实现,它们只接受位于 JSON 文本顶层的 JSON
对象或 JSON 数组。为了与这类实现实现最大互操作性,协议设计者
SHOULD NOT 使用既不是对象也不是数组的顶层 JSON 文本。
4.2. 必须忽略策略
协议投入生产后经常需要进行更改。允许以不干扰现有软件运行的
方式引入新协议元素的协议,在实践中已证明具有优势。
这可以称为“必须忽略”策略,意思是当实现遇到无法识别的协议元素
时,它应将协议事务的其余部分视为该新元素根本没有出现,尤其是,
该实现 MUST NOT 将此视为错误条件。相反的“必须理解”策略不容许
引入新的协议元素,虽然这在某些协议设计中已被证明是必要的,
Bray 标准跟踪 [第 4 页]
RFC 7493 I-JSON 消息格式 2015 年 3 月
但总体而言,它被发现过于限制且脆弱。
在 I-JSON 协议设计中支持使用 Must-Ignore 的一种好方法是,要求
顶层协议元素必须是 JSON 对象,并规定名称无法识别的成员 MUST
被忽略。
4.3. 时间和日期处理
协议通常包含设计用于保存时间戳或时间持续时间的数据项。对于
所有这类数据项,RECOMMENDED 将其表示为 [RFC3339] 中规定的
ISO 8601 格式字符串值,并附加以下限制:使用大写字母而不是小写
字母,包含时区而不是默认时区,并且即使值为 "00" 也包含可选的
尾随秒。还 RECOMMENDED 所有包含时间持续时间的数据项都符合
RFC 3339 附录 A 中的 "duration" 产生式,并采用相同的附加限制。
4.4. 二进制数据
当要求 I-JSON 协议元素包含任意二进制数据时,RECOMMENDED 将该
数据以 base64url 编码为字符串值;见 [RFC4648] 第 5 节。
5. 安全考虑事项
适用于 JSON 的所有安全考虑事项(见 RFC 7159)也适用于
I-JSON。不存在特定于 I-JSON 的额外安全考虑事项。
由于 I-JSON 禁止使用某些可能导致接收软件出现不可预测行为的
JSON 习惯用法,它可能被证明是互联网协议更安全的基础,并且可能
是具有特殊安全需求的协议设计者的良好选择。
6. 规范性参考文献
[IEEE754] IEEE, "浮点运算 IEEE 标准", IEEE
754-2008, 2008, <http://grouper.ieee.org/groups/754/>.
[RFC2119] Bradner, S., "RFC 中用于表示需求级别的关键词",
BCP 14, RFC 2119, 1997 年 3 月,
<http://www.rfc-editor.org/info/rfc2119>.
Bray 标准跟踪 [第 5 页]
RFC 7493 I-JSON 消息格式 2015 年 3 月
[RFC3339] Klyne, G. and C. Newman, "互联网上的日期和时间:
时间戳", RFC 3339, 2002 年 7 月,
<http://www.rfc-editor.org/info/rfc3339>.
[RFC3629] Yergeau, F., "UTF-8,ISO
10646 的一种变换格式", STD 63, RFC 3629, 2003 年 11 月,
<http://www.rfc-editor.org/info/rfc3629>.
[RFC4627] Crockford, D., "JavaScript 对象表示法 (JSON) 的
application/json 媒体类型", RFC 4627, 2006 年 7 月,
<http://www.rfc-editor.org/info/rfc4627>.
[RFC4648] Josefsson, S., "Base16、Base32 和 Base64 数据
编码", RFC 4648, 2006 年 10 月,
<http://www.rfc-editor.org/info/rfc4648>.
[RFC7159] Bray, T., Ed., "JavaScript 对象表示法 (JSON) 数据
交换格式", RFC 7159, 2014 年 3 月,
<http://www.rfc-editor.org/info/rfc7159>.
[UNICODE] The Unicode Consortium, "Unicode 标准",
<http://www.unicode.org/versions/latest/>.
致谢
I-JSON 完全依赖于 JSON 的设计,而 JSON 的设计很大程度上归功于
Douglas Crockford。具体细节受到 IETF JSON 工作组中 RFC 7159
设计贡献者的强烈影响。
作者地址
Tim Bray(编辑)
Textuality Services
EMail: tbray@textuality.com
URI: https://www.tbray.org/
Bray 标准跟踪 [第 6 页]