 # aardio 标准库 JSON 解析规范

发布日期：2020-12-27

参考: [JSON 标准库](../library-guide/std/JSON/_.html)

JSON 字符串化时完全符合 JSON 官方标准( https://json.org/json-zh.html )。
JSON 解析时完全支持 JSON，JSONP，并使用宽松的原则兼容 JSON5，兼容部分类 YAML 语法。

aardio 以“宽进严出、简洁高效”为基本原则。
解析时规则尽可能宽松容错，生成 JSON 字符串则严格遵守标准 JSON 规则。

aardio 标准库在遵守 JSON 标准协议的前提下为 JSON 解析器扩展了以下功能：

### 1. 可省略和替换的格式标记

- 允许省略根节点对象外部的 `{}`
- 允许使用分号、空格、换行替代元素分隔符`,`
- 允许使用等号、空格、换行替代对象键值分隔符`:`
- 允许省略字符串外部的引号。

### 2. 根节点

- JSON 节点可以是任意数据类型，单个字符串、数值都可以解析并返回值。
- 根节点是对象时，可以省略外层的花括号。
- 根节点是字符串时不可省略引号。
- 根节点解析成功的 JSON 后面如果还有多余的文本时忽略。
- 根节点兼容 JSONP 格式

### 3. 字符串

字符串置于双引号中时支持 JSON 转义符。
JSON 字符串置于单引号内不支持 JSON 转义符，使用 2 个单引号表示原始单引号。
在引号内部时字符串可以换行。

要特别注意 aardio 语法规则正好跟上面相反：
aardio 代码里单引号内是“编译时转义字符串”（反斜杆识别为转义符，属于 “JavaScript 风格字符串” ），而双引号内是原样字符串（编译时将反斜杆作为普通字符，并以两个双引号表示原始双引号,属于 “BASIC/SQL 风格” 字符串）。

JSON 字符串可省略首尾引号，此时不支持 JSON 转义符，遇到回车或换行、逗号、中括号、大括号时字符串结束解析。字符串作为对象键名如果省略引号时不能包含空白字符、换行或键值分隔符。 

### 4. 注释

1、支持 `//` 或 `#` 引导的单行注释
2、支持包含于 `/*......*/` 内的块注释（注意这里按js规则不匹配首尾星号数目）。 

### 5. 数值

数值支持 16 进制

### 6. null值

可以使用 `null`,`undefined`,`~` 表示 `null` 值。

### 7. 日期时间

可使用 ISO 8601 格式表示日期时间，合法的格式如下：

`2021-01-1`
`2021-02-1T15:02:31+08:00`
`2021-02-1T15:02:31+08:00Z`

数字前可不用补 0，但日期分隔符必须使用短横线，时间分隔符必须使用冒号，
尾部时区不可以包含空白字符，但可以包含 +-: 等字符以及数字、字母。

日期时间不用包含在引号内，引号内会被误别为字符串，示例：

```json
{"time":2021-01-1,"string":"2021-01-1" }
```