The JavaScript Object Notation (JSON) Data Interchange Format
- 状态: Proposed Standard
- 发布日期: March 2014
- Stream: IETF
- 废弃了: RFC4627, RFC7158
- 被废弃: RFC8259
- 勘误: 无勘误
JavaScript对象表示法(JSON)数据交换格式
Abstract (摘要)
JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.
JavaScript对象表示法(JSON)是一种轻量级、基于文本、语言无关的数据交换格式.它源自ECMAScript编程语言标准.JSON定义了一组用于结构化数据可移植表示的小型格式化规则.
This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.
本文档消除了JSON其他规范的不一致性,修复了规范错误,并提供基于经验的互操作性指导.
Status of This Memo (文档状态)
This is an Internet Standards Track document.
这是一份互联网标准跟踪文档.
Table of Contents (目录)
- 1. Introduction (简介)
- 2. JSON Grammar (JSON语法)
- 3. Values (值)
- 4. Objects (对象)
- 5. Arrays (数组)
- 6. Numbers (数字)
- 7. Strings (字符串)
- 8. String and Character Issues (字符串和字符问题)
- 9. Parsers (解析器)
- 10. Generators (生成器)
- 11. IANA Considerations (IANA考虑)
- 12. Security Considerations (安全考虑)
- 13. Examples (示例)
- 14. Contributors (贡献者)
- 15. References (参考文献)
- Appendix A. Changes from RFC 4627 (附录A. 相对RFC 4627的变更)
Author (作者)
Tim Bray (editor)
Google, Inc.
Date: March 2014
Obsoletes: RFC 4627, RFC 7158
Category: Standards Track
1. Introduction (简介)
JavaScript 对象表示法 (JavaScript Object Notation, JSON) 是一种用于序列化结构化数据的文本格式. 它源自 JavaScript 的对象字面量, 如 ECMAScript Programming Language Standard, Third Edition [ECMA-262] 中所定义.
JSON 可以表示四种基本类型 (primitive type): 字符串 (string), 数字 (number), 布尔值 (boolean) 和 null, 以及两种结构化类型 (structured type): 对象 (object) 和数组 (array).
字符串是由零个或多个 Unicode 字符 [UNICODE] 组成的序列. 注意, 此引用指向 Unicode 的最新版本, 而不是某个特定版本. 预计 UNICODE 规范未来的变更不会影响 JSON 的语法.
对象是由零个或多个名称/值对 (name/value pair) 组成的无序集合, 其中名称 (name) 是字符串, 值 (value) 是字符串, 数字, 布尔值, null, 对象或数组.
数组是由零个或多个值组成的有序序列.
术语 "object" 和 "array" 来自 JavaScript 的约定.
JSON 的设计目标是最小化, 可移植, 文本化, 并且作为 JavaScript 的子集.
1.1. Conventions Used in This Document (本文档使用的约定)
本文档中的关键字 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" 和 "OPTIONAL" 应按 [RFC2119] 中的描述解释.
本文档中的语法规则应按 [RFC5234] 中的描述解释.
1.2. Specifications of JSON (JSON的规范)
本文档更新了 [RFC4627], 后者描述了 JSON 并注册了媒体类型 "application/json".
ECMAScript specification [ECMA-262] Version 5.1 的 Section 15.12 使用 ECMAScript 术语描述了 JSON. [ECMA-404] 也描述了 JSON.
JSON 语法的所有规范都在该语言的语法元素上保持一致.
1.3. Introduction to This Revision (本修订版简介)
自 RFC 4627 发布以来, JSON 已得到非常广泛的使用. 这些经验揭示了一些模式, 它们虽为规范所允许, 却已经造成互操作性问题.
此外, 已报告少量勘误 (参见 RFC Errata IDs 607 [Err607] 和 3607 [Err3607]).
本文档的目标是应用这些勘误, 消除与其他 JSON 规范之间的不一致, 并突出说明可能导致互操作性问题的实践.
2. JSON Grammar (JSON语法)
JSON 文本 (JSON text) 是一个令牌 (token) 序列. 令牌集合包括六个结构字符 (structural character), 字符串, 数字和三个字面量名称 (literal name).
JSON 文本是一个序列化的值 (value). 注意, JSON 的某些早期规范将 JSON 文本限制为对象或数组. 在需要 JSON 文本的地方, 只生成对象或数组的实现具有互操作性, 因为所有实现都会接受它们作为符合规范的 JSON 文本.
JSON-text = ws value ws
以下是六个 structural character:
begin-array = ws %x5B ws ; [ left square bracket
begin-object = ws %x7B ws ; { left curly bracket
end-array = ws %x5D ws ; ] right square bracket
end-object = ws %x7D ws ; } right curly bracket
name-separator = ws %x3A ws ; : colon
value-separator = ws %x2C ws ; , comma
六个结构字符中任意一个的前后都允许出现无意义的空白 (whitespace).
ws = *(
%x20 / ; Space
%x09 / ; Horizontal tab
%x0A / ; Line feed or New line
%x0D ) ; Carriage return
7. Strings (字符串)
字符串 (string) 的表示方式类似于 C 语言家族所使用的约定. 字符串以引号 (quotation mark) 开始和结束. 所有 Unicode 字符都可以放在引号内, 但必须转义的字符除外: 引号, 反斜杠 (reverse solidus), 以及控制字符 (control character, U+0000 到 U+001F).
任何字符都可以被转义. 如果字符位于基本多文种平面 (Basic Multilingual Plane, U+0000 到 U+FFFF), 则它可以表示为一个六字符序列: 一个反斜杠, 后跟小写字母 u, 再后跟四个对该字符码点 (code point) 进行编码的十六进制数字. 十六进制字母 A 到 F 可以使用大写或小写. 因此, 例如, 只包含单个反斜杠字符的字符串可以表示为 "\u005C".
或者, 某些常用字符存在双字符序列的转义表示 (escape representation). 因此, 例如, 只包含单个反斜杠字符的字符串可以更紧凑地表示为 "\".
要转义不在基本多文种平面中的扩展字符, 该字符表示为一个 12 字符序列, 该序列对 UTF-16 代理对 (surrogate pair) 进行编码. 因此, 例如, 只包含 G clef 字符 (U+1D11E) 的字符串可以表示为 "\uD834\uDD1E".
string = quotation-mark *char quotation-mark
char = unescaped /
escape (
%x22 / ; " quotation mark U+0022
%x5C / ; \ reverse solidus U+005C
%x2F / ; / solidus U+002F
%x62 / ; b backspace U+0008
%x66 / ; f form feed U+000C
%x6E / ; n line feed U+000A
%x72 / ; r carriage return U+000D
%x74 / ; t tab U+0009
%x75 4HEXDIG ) ; uXXXX U+XXXX
escape = %x5C ; \
quotation-mark = %x22 ; "
unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
8. String and Character Issues (字符串和字符问题)
8.1. Character Encoding (字符编码)
JSON 文本 SHALL 使用 UTF-8, UTF-16 或 UTF-32 编码. 默认编码是 UTF-8, 以 UTF-8 编码的 JSON 文本具有互操作性, 因为它们能够被最大数量的实现成功读取; 有许多实现无法成功读取使用其他编码 (例如 UTF-16 和 UTF-32) 的文本.
实现 MUST NOT 在 JSON 文本的开头添加字节顺序标记 (byte order mark). 出于互操作性考虑, 解析 JSON 文本的实现 MAY 忽略字节顺序标记的存在, 而不是将其视为错误.
8.2. Unicode Characters (Unicode字符)
当 JSON 文本中表示的所有字符串都完全由 Unicode 字符 [UNICODE] 组成时 (无论采用何种转义方式), 该 JSON 文本具有互操作性, 因为解析它的所有软件实现都会就对象和数组中名称与字符串值 (string value) 的内容达成一致.
然而, 本规范中的 ABNF 允许成员名称 (member name) 和字符串值包含无法编码 Unicode 字符的位序列 (bit sequence); 例如, "\uDEAD" (单个未配对的 UTF-16 surrogate). 已经观察到此类实例, 例如某个库截断 UTF-16 字符串时没有检查截断位置是否拆开了代理对. 接收包含此类值的 JSON 文本的软件行为是不可预测的; 例如, 实现可能对字符串值的长度返回不同值, 甚至遭遇致命的运行时异常.
8.3. String Comparison (字符串比较)
软件实现通常需要测试对象成员的名称是否相等. 将文本表示转换为 Unicode 码元 (code unit) 序列, 然后按码元逐个进行数值比较的实现具有互操作性, 因为实现会在所有情况下就两个字符串相等或不相等达成一致. 例如, 对带有转义字符但未进行转换的字符串直接比较的实现, 可能会错误地认为 "a\b" 和 "a\u005Cb" 不相等.
9. 解析器 (Parsers)
JSON parser (JSON 解析器) 将 JSON text (JSON 文本) 转换为另一种表示形式. JSON parser MUST 接受所有符合 JSON grammar (JSON 语法) 的文本. JSON parser MAY 接受非 JSON 形式或扩展.
实现可以对其接受的文本大小设置限制. 实现可以对最大嵌套深度设置限制. 实现可以对 number (数字) 的范围和精度设置限制. 实现可以对 string (字符串) 的长度和字符内容设置限制.
10. Generators (生成器)
JSON generator (JSON 生成器) 生成 JSON text (JSON 文本). 生成的文本 MUST 严格符合 JSON grammar (JSON 语法).
12. Security Considerations (安全考虑)
一般而言, scripting language (脚本语言) 存在安全问题. JSON 是 JavaScript 的子集, 但排除了赋值和调用.
由于 JSON 的语法借鉴自 JavaScript, 可以使用该语言的 "eval()" 函数来解析 JSON text (JSON 文本). 这通常会构成不可接受的安全风险, 因为文本可能同时包含可执行代码和数据声明. 同样的考虑也适用于任何其他编程语言中类似 eval() 的函数, 只要 JSON 文本符合该语言的语法.
14. Contributors (贡献者)
RFC 4627 由 Douglas Crockford 编写. 本文档是在该文档基础上作出相对少量修改而形成的; 因此, 本文档中的绝大部分文本都出自他.
Appendix A. Changes from RFC 4627 (附录 A. 相对 RFC 4627 的变更)
本节列出本文档与 RFC 4627 文本之间的变更.
-
更改了文档的标题和摘要.
-
将对 [UNICODE] 的引用改为不指定具体版本.
-
添加了 "Specifications of JSON" 一节.
-
添加了 "Introduction to This Revision" 一节.
-
更改了 "JSON text" 的定义, 使其可以是任何 JSON value (JSON 值), 移除了它必须是 object (对象) 或 array (数组) 的约束.
-
添加了关于重复 object member name (对象成员名称), member ordering (成员顺序) 和 interoperability (互操作性) 的文字.
-
澄清不要求 array 中的 value 属于同一种 JSON type (JSON 类型).
-
应用了 RFC 4627 的 erratum #607, 以正确对齐 "object" 定义的 artwork.
-
在 "Numbers" 一节中将 "as sequences of digits" 改为 "in the grammar below", 并明确指出使用 base 10.
-
添加了关于作为 IEEE754 函数的 number 互操作性的文字, 并添加了 IEEE754 引用.
-
添加了关于互操作性, Unicode character (Unicode 字符) 和 string comparison (字符串比较) 的文字. 为此, 将旧的 "Encoding" 一节改为 "String and Character Issues" 一节, 包含三个子节: "Character Encoding", "Unicode Characters", and "String Comparison".
-
更改了 "Parsers" 一节中的指导, 指出实现可以对 number 的范围 "and precision" 设置限制.
-
更新并整理了 "IANA Considerations" 一节.
-
创建了真正的 "Security Considerations" 一节, 并将文本从之前的 "IANA Considerations" 一节中移出.
-
通过删除以 "A JSON text can be safely passed" 开头的安全考虑以及随附的 JavaScript 代码, 应用了 RFC 4627 的 erratum #3607.
-
在 "Security Considerations" 一节中添加了一条注释, 指出在 JavaScript 或任何其他 JSON text 符合其语法的语言中使用 "eval()" 函数的风险.
-
在 "IANA Considerations" 中添加了一条注释, 澄清 application/json media type 没有 "charset" 参数.
-
在第一个示例中将 "100" 改为 100, 并添加了一个 boolean (布尔) 字段.
-
添加了包含简单 value 的 JSON text 示例, 这些 value 既不是 object 也不是 array.
-
添加了 "Contributors" 一节, 向 Douglas Crockford 致谢.
-
添加了对 RFC 4627 的引用.
-
将 ECMAScript 引用从 Normative 移至 Informative, 更新为引用 ECMAScript 5.1, 并添加了对 ECMA 404 的引用.