ECMA404 标准 - JSON 语法

209 阅读5分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第3篇文章,点击查看活动详情

原文:www.ecma-international.org/wp-content/…

范围

JSON 是一种轻量的、基于文本的、具有语言无关性的语法,用于定义数据交换格式。它起源于 ECMAScript 编程语言,但其具有编程语言无关性。JSON 定义了一个小的结构化规则集对结构化数据进行可移植表示。

定义合法 JSON 语法是本规范的唯一目,不定义具体的语义,也不定义存在于编程语言内部时的数据结构。JSON 语法可被用于表示多种语义,可被编程语言以多种方式进行处理。要使 JSON 进行有意义的信息交换,需要相关各方在应用的语义上达成一致。定义 JSON 具体的语义说明可以是其他规范的主题。 同样,编程语言对 JSON 的映射也可以单独定义。 例如 ECMA-262 定义了合规的 JSON 文本和 ECMAScript 运行时数据结构之间的映射。

标准

合规的 JSON 文本是完全符合本规范定义的 JSON 语法的 Unicode 码点序列。JSON 处理器不应接受任何不符合 JSON 语法的输入。 符合条件的处理器可能会施加语义限制,以限制它将处理的 JSON 文本。

引用标准

以下文档对于本文档的应用是必不可少的。凡是注日期的引用文件,仅所引用的版本适用。凡是不注日期的引用文件,其最新版本(包括所有的修改)适用于本规范。

ISO/IEC 10646, Information Technology – Universal Coded Character Set (UCS)

The Unicode Consortium. The Unicode Standard www.unicode.org/versions/la…

Bray, T., Ed. "The JavaScript Object Notation (JSON) Data Interchange Format", RFC 8259

该规范和 [RFC 8259] 都提供了 JSON 的语法规范,但是使用了不同的形式。两个规范的目的是定义相同的语法。

JSON 文本

JSON 文本是符合 JSON 语法并为 Unicode 编码的单词(Token)序列,单词包括六种结构性单词、字符串、数字和三种字面名单词。

六种结构性单词:

单词Unicode 编码说明
[U+005B左方括号
{U+007B左花括号
]U+005D右方括号
}U+007D右花括号
:U+003A冒号
,U+002C逗号

三种字面名单词:

单词Unicode 编码
trueU+0074 U+0072 U+0075 U+0065
falseU+0066 U+0061 U+006C U+0073 U+0065
nullU+006E U+0075 U+006C U+006C

任何单词前后均可添加额外的空白。空白可以由以下一个或多个码元构成的序列:制表符(U+0009)、换行符(U+000A)、回车 (U+000D)和空格(U+0020)。空白不允许存在任何单词中,除了字符串中允许有空格。

JSON 值

JSON 值可以是对象、数组、数字、字符串、true、false 或 null。

image

对象

一个对象由一对包裹着零个或多个键值对的花括号构成。键是字符串。每个键后都有一个冒号,将其与值分开。单个逗号将值与后面的键分开。JSON 语法不对用作键的字符串施加任何限制,不要求键的字符串是唯一的,并且不对键值对的排序赋予任何意义。

image

数组

一个数组是由一对包裹着零个或多个值的方括号构成。这些值用逗号分隔。JSON 语法没有为值的顺序定义任何特定的含义。但是,JSON 数组通常用于一些排序具有语义的情况。

image

数字

一个数字是一个没有前导零的十进制数字序列。它首位可能减号(U+002D)。它可能有小数部分,以小数点(U+002E)为前缀。 它可能有一个指数,以 e(U+0065)或 E(U+0045)为前缀,以及可选的 +(U+002B)或 –(U+002D)。这些数字的编码范围为 U+0030 至 U+0039。

image

不允许使用不能表示为数字序列的值(例如 Infinity 和 NaN)。

字符串

字符串是由一对引号(U+0022)包裹的 Unicode 码点序列。除必须转义的码点外,所有码点都可以放在引号内:引号(U+0022),反斜线(U+005C)和控制字符 U+0000 至 U+001F。有些字符使用由两个字符构成的转义序列表示。

\" 表示引号(U+0022)。 \\ 表示反斜线(U+005C)。 \/ 表示正斜线(U+002F)。 \b 表示退格(U+0008)。 \f 表示换页(U+000C)。 \n 表示换行(U+000A)。 \r 表示回车(U+000D)。 \t 表示制表符(U+0009)。

例如,仅包含单个反斜线的字符串可以表示为"\\"

任何字符都可以表示为十六进制转义序列。十六进制数字的含义由 ISO/IEC 10646 确定。如果字符编码在基本多语言平面( Basic Multilingual Plane)中(U+0000 至 U+FFFF),则可以表示为6个字符的序列:反斜线后跟小写字母 u,再跟4个十六进制数字。

以下四种情况产生相同的结果:

"\u002F" "\u002f" "/" "/"

为了转义不在基本多语言平面中的码点,可以将该字符表示为12个字符的序列,对应该码点的 UTF-16 编码。例如,仅包含 G 谱号字符(U+1D11E)的字符串可以表示为 "\uD834\uDD1E"。注意 JSON 语法允许 Unicode 当前没有分配字符的码点。然而,JSON 文本处理器是将这样的转义字符序列转换为单个码点还是原样显示,由处理器根据语义自行决定。

image