JSON、YAML 与 CSV 转换工具

在浏览器中运行,不上传任何内容

在 JSON、YAML 和 CSV 之间任意方向转换,CSV 数据可以用表格查看。

Input · JSON

Output · YAML

Converted YAML appears here as you type.

Ready
Ln 1, Col 1

JSON、YAML 和 CSV 各有什么用途

JSON、YAML 和 CSV 都用文本描述数据,但用途不同。JSON 是 Web API 的格式:严格,程序很容易解析。YAML 能表达和 JSON 相同的结构(对象、列表、字符串、数字、布尔值),但用缩进代替花括号,更适合手工编辑;OpenAPI 规范、CI 流水线、Docker Compose 和 Kubernetes 文件通常都是 YAML。CSV 是一张表:第一行是列名,之后每行一条记录。

转换器先把输入读入统一的数据模型,再按目标格式写出。数字会保留原本写法中的每一位,所以 19 位的 ID 或 1.50 都不会变。转换过程中需要做出的判断(YAML 读成数字的值、被展开成列的嵌套对象、出现两次的键)都会列在输出上方的提示中。

YAML 按 YAML 1.2 的 core schema 读取,这是该标准的当前版本。true、false 和 null 是值;yes、no、on 和 off 仍然是字符串,这一点与 PyYAML 等较旧的 YAML 1.1 库不同。写出 YAML 时,凡是任一版本可能读成其他类型的字符串都会加上引号,所以 "yes"、"007" 和 "2024-01-01" 在任何地方都会读回同样的字符串。

使用方法

  1. 1在工具栏的 From 和 To 中选择格式。把数据粘贴到 Input 面板,或把文件拖进去,也可以按 Ctrl+O 打开文件(最大 5 MB);打开 .yaml、.csv 或 .json 文件时会自动设置 From。
  2. 2在 Output 面板查看结果,它会随输入实时更新。涉及 CSV 时,Table 标签页会显示行和列。
  3. 3调整工具栏中出现的选项:CSV 分隔符(或 Detect)、第一行是否为表头、数字和 true/false 是否转为 JSON 值、带点的列名是否嵌套,以及数组写入 CSV 的方式。
  4. 4如果输入无效,输出面板和状态栏会给出行号和列号。按 F8 把光标移过去。
  5. 5Swap(Shift+Alt+S)会把输出放回输入并交换格式,方便你检查来回转换的结果。Ctrl+Z 可以撤销。
  6. 6复制输出,或按 Ctrl+S 下载。

问题排查

YAML 中不能用制表符缩进
YAML 只允许用空格缩进。把行首的制表符换成空格;大多数编辑器都能帮你自动转换。
值后面不能接 key: 行
某一行缩进在一个键下面,而这个键在自己那一行已经有值了。要么删掉冒号后面的值,让缩进的行成为它的子项,要么修正缩进。
重复的键
YAML 要求映射中的每个键都是唯一的。重命名或删除其中一个;错误提示指向第二个。
第 4 行有 5 个字段,而表头只有 4 个
这一行中某个值包含了分隔符却没有加引号,或者表头缺了一列。给这个值加上引号("Pune, MH"),或检查所选的分隔符。
邮编或 ID 丢失了前导零
从 CSV 转换时,007 这样的值仍是文本。从 YAML 转换时,按照 YAML 标准,没有引号的 007 就是数字 7,提示中会说明这一点;在 YAML 中给它加上引号即可保留为文本。
不支持多个 YAML 文档
输入中有多个用 --- 分隔的文档,Kubernetes 文件中很常见。请逐个文档转换。

常见问题

支持哪些 YAML 特性?

支持块映射和块列表、[a, b] 和 {a: 1} 这样的流式集合、跨多行的普通字符串及单引号和双引号字符串、带 chomping 指示符的字面量块 | 和折叠块 >、注释、锚点和别名、<< 合并键以及 !!str 标签。遇到复杂的 ? 键、其他标签或单个输入中的多个文档时,会报错并指出是哪个特性,而不是生成错误的数据。

嵌套的 JSON 如何写成 CSV?

每一行对应数组中的一个对象。嵌套对象会变成带点的列名,例如 address.city。数组默认以 JSON 文本写在一个单元格中;如果选择 In columns,则会分散到带编号的列(tags.0、tags.1)。列是所有行中键的并集,按首次出现的顺序排列。null 会变成空单元格。

CSV 转 JSON 会得到哪些类型?

打开 Numbers 时,只有已经完全按 JSON 数字格式书写的值(42、-1.5、1e3)才会变成数字,true 和 false 会变成布尔值。007、+5 和 1,000 仍是文本,空单元格也一样。关闭 Numbers 可以把所有值都保留为字符串。

我的数据会发送到服务器吗?

不会。解析和转换都在你的浏览器中完成。为了刷新后不丢失,粘贴的内容会保存在当前标签页的 session storage 中,直到你清除它或关闭标签页。Copy link 会把输入放在链接的 # 之后,浏览器从不把这部分发送给服务器,但拿到链接的人都能看到内容。格式和分隔符等设置会保存在当前浏览器中。