# 数据格式
`json/` 与 `yaml/` 在序列化文本与 Deft 值之间转换。它们是带命名空间的
标准库函数,被编译进每个运行时,并以前缀调用形式使用
(`[json/parse ...]`)。两个读取器都返回带关键字键的 Deft 映射,外加
字符串、数字、布尔值和 `nil` —— JSON 数组返回为向量;格式错误的输入
产生 `%Err{:message}`。关于转换的值一侧,参见 Types 和
Maps。
## 函数
| 函数 | 用途 |
|---|---|
| `json/parse "text"` | 将 JSON 字符串解析为 Deft 值 |
| `json/stringify $value` | 将值转换为紧凑的 JSON 字符串 |
| `json/pretty $value ?indent` | 将值转换为美化打印的 JSON;可选缩进字符串(默认两个空格) |
| `yaml/parse "text"` | 将 YAML 字符串解析为 Deft 值 |
| `yaml/load "path"` | 从磁盘读取 YAML 文件并解析为 Deft 值 |
| `yaml/stringify $value ?indent` | 将值转换为 YAML 字符串;可选缩进字符串(默认两个空格) |
说明:
- parse/load 的划分是有意为之:`yaml/parse` 接受文档文本本身,而
`yaml/load` 接受文件系统路径并替你读取(因此它会经过 `fs/` 层和
VFS 挂载)。不存在 `json/load`;用 `fs/read` 读取文件并用 `unwrap`
取出文本后传给 `json/parse`。参见 Filesystem。
- JSON 对象和 YAML 映射返回为带关键字键的 Deft 映射,因此字段访问可
直接使用:`$doc~name`。
- YAML 读取器刻意保持简单。标量和映射能干净地解析,但块序列目前返回
为按索引作键的映射(`%{ :0 x :1 y }`),流序列(`[x, y]`)返回为
原始字符串。数组重要时请优先使用 `json/parse`。
- `json/pretty` 和 `yaml/stringify` 接受可选的缩进字符串;
`yaml/stringify` 会追加末尾换行符。
## 示例
### 解析并访问 JSON
set doc [json/parse "{\"name\": \"ada\", \"age\": 36, \"admin\": true}"] echo $doc~name # ada echo $doc~age # 36 set text [json/stringify $doc] echo $text # {"admin":true,"age":36,"name":"ada"}
### 美化打印
echo [json/pretty %{ :name "ada" :nested %{ :ok true } }] # A custom indent string is the optional second argument echo [json/pretty %{ :name "ada" } "--"]
### 读写 YAML
def path [fs/tmp-path "app.yaml"] fs/write $path "name: ada\nport: 8080\n" set cfg [yaml/load $path] echo $cfg~name "listens on" $cfg~port # The same mapping, from a string and back out as YAML set inline [yaml/parse "name: ada\nport: 8080\n"] echo [yaml/stringify $inline]
### 在格式之间转换
set from-yaml [yaml/parse "service: web\nport: 8080\n"] set as-json [json/stringify $from-yaml] echo $as-json # {"port":8080,"service":"web"}