JSON、YAML、XML、CSV——一套工具的来回转换(2026)
JSON、YAML、XML、CSV——一套工具的来回转换
如果你是 2026 年的开发者,过去一个月里很可能开过 30 个标签页,名字大概是"json to yaml online"或"csv to xml converter free"。每个项目、每条 CI 流水线、每次跨团队数据交接,都至少有一跳格式转换:分析团队导 CSV、平台团队期待 YAML、合作方集成走 XML——你用一次性 Python 脚本把它们粘起来,一切都好,直到某人名字里包含一个逗号外加一个 unicode emoji。
本文会讲清楚每个后端开发者都该流畅读写的四种规范数据交换格式、它们各自为什么存在,以及如何用 Ai2Done 的开发者工具箱 安全地来回转换——包括 JSON 格式化、XML 格式化、YAML 格式化,以及 CSV 转 Excel、XML 转 JSON、XML 转 CSV 等转换器——全部 100% 在你的浏览器内运行。
TL;DR
- JSON 是现代默认——除非有理由不用,就用它。
- YAML 是带注释、少标点的 JSON——给人读和编辑的配置用它。
- XML 是你企业集成至今仍要求的格式——对方不让步时用它。
- CSV 是业务方真会打开的格式——分析、导出、面向 Excel 时用它。
- 来回转换(JSON → YAML → JSON)几乎总是无损。CSV ↔ JSON——当 JSON 有嵌套时不无损;要刻意扁平化或反规范化。
为什么这件事比看起来更难
朴素的工程师以为"数据格式转换就是 JSON.parse 和 JSON.stringify 换不同语法"。实践中每种格式都有微妙的坑,在生产里咬人:
JSON 没有注释、没有尾随逗号、没有 undefined、没有 Date 类型、没有 Map、没有 BigInt。超过 2^53 的数字在 JavaScript 中静默丢精度。字符串必须 UTF-8(不允许未转义 \r\n)。出乎意料地多 Java 或 .NET 写出的"JSON"文件并不完全合法——它们带注释或尾逗号。
YAML 以过度灵活著称——规范 80 页,yes/no/on/off 布尔速记会把挪威国家码 "NO" 静默解析为 false;缩进错误会在不同库里产出大相径庭的解析。一份在 Ruby 里正确加载的 YAML,在 Python 或 Go 里可能不同(YAML 1.1 vs YAML 1.2 vs 自定义风格差异)。
XML 啰嗦但无歧义。它真正的复杂在命名空间(xmlns: 那套)与属性 vs 子元素——不同的 XML 写法对相同逻辑数据用截然不同的表达。还有特殊字符的 CDATA vs 实体转义抉择——下游期待哪种就可能在另一种上挂掉。
CSV 是最糟的,因为根本没有真正规范。不同工具用不同的引号规则、不同的转义、不同的单元格内换行处理。Microsoft Excel 写的"CSV"在 Google Sheets 里打开错位,反之亦然。UTF-8 与 Windows-1252 编码错配,约 30% 的真实世界 CSV 导出把 "Pokémon" 变成 "Pokémon"。
一个好的格式转换器必须做两件不显眼的事:(1) 容忍真实工具产出的非严格输入;(2) 产出严格的、下游能可靠接受的输出。多数在线转换器两样都不做。
方法一:Ai2Done 格式工具(浏览器端)
Ai2Done 格式枢纽 为每种格式都备有独立工具,并提供若干对转换。任意转换的流程:
- 打开工具——如 JSON 格式化器 或 XML 转 JSON。
- 粘贴输入(或拖入文件)到左侧面板。
- 输出即时出现在右侧面板——格式化与转换边输入边发生,在你浏览器本地完成。
- 复制或下载结果。文件输入下,工具产出单一输出文档或 ZIP(输入含多个文档时)。
我们的用户常见工作流:
- JSON → YAML:打开 JSON 格式化器,粘 JSON,YAML 输出出现在"转换为"面板。反方向用 YAML 格式化器。
- CSV → JSON:粘 CSV,工具自动检测分隔符(逗号、制表、分号、管道)与引号。除非取消勾选,第一行视作表头。
- XML → JSON:粘 XML,工具用命名空间别名作键前缀;属性变
@attr键,文本内容变#text。 - XML → CSV:在 XML 转 CSV 工具里,重复元素被扁平成行(你挑哪种元素作为"行"边界)。
- CSV → Excel:用 CSV 转 Excel,工具产出真正的
.xlsx(不是改后缀的 CSV),尊重 UTF-8 让中文、日文与 emoji 来回转换不出错。
全部在你的浏览器内运行。JSON、YAML、XML 解析使用久经考验的库(JSON Schema 校验用 ajv、YAML 用 js-yaml、XML 用 fast-xml-parser),编译进单一约 150 KB 的 bundle。
方法二:命令行 jq + yq + xmlstarlet
终端居民的经典组合:
# JSON
cat data.json | jq '.'
# YAML
cat data.yaml | yq '.' # mikefarah 的 Go 版 yq
yq -o=json '.' data.yaml > data.json # YAML → JSON
# XML
xmlstarlet sel -t -c '/' data.xml # 美化输出
# CSV → JSON
csvkit: csvjson data.csv > data.json
mlr (Miller): mlr --c2j cat data.csv
优势:可脚本、可在管道里组合、不需要浏览器标签。缺点:每个工具有自己的 DSL 要学,没一个全包四种格式,你最后会为每个项目写一个一次性 Makefile 或 justfile。
适合重复、自动化转换(夜间 cron 从 FTP 拉 CSV 推 JSON 到 API)。对周二下午"我要把这份 CSV 转成 JSON 粘到 Postman 里"则属过度。
方法三:Pandas(数据才是重点时)
如果你的转换任务实际上是数据变换——透视行、丢列、过滤、去重、再输出——直接上 pandas:
import pandas as pd
df = pd.read_csv('input.csv')
df = df[df['status'] == 'active']
df = df.drop_duplicates(subset='email')
df.to_json('output.json', orient='records', force_ascii=False)
Pandas 读写 CSV、Excel、JSON、Parquet、SQL 等十多种格式。CSV 有 50 万行、写输出前需要做分析时,它是正确答案。50 行的数据文件本想 5 秒搞定?过度——pip install pandas 一项就要 30 秒。
我们是怎么做格式工具的(技术细节)
Ai2Done 格式工具箱围绕一个共享的规范中间表示构建——任意输入(JSON、YAML、XML、CSV)一旦解析就变成一棵纯 JavaScript 对象树。所有转换变成"把树序列化为格式 X"。这样只需 N 个解析器与 N 个序列化器,而非 N²。
值得说的工程挑战:
- XML 属性 vs 子元素问题。我们用约定俗成的
@attr前缀表示属性、#text表示文本内容,并在 UI 里提供"无损往返模式"。可以 XML → JSON → XML 拿回同样的 XML(空白差异除外)。 - CSV 表头推断。我们嗅探前 5 行:若第 1 行全文本、第 2 行起含数值,则第 1 行是表头;不确定时询问。约 95% 的真实 CSV 在零配置下被正确识别。
- YAML 安全。我们用
js-yaml的safeLoad,避开 YAML 1.1 臭名昭著的!!python/object代码执行漏洞(Ruby 的 YAML 库被坑了多年)。用户输入的 YAML 不能在你浏览器里执行代码。 - BigInt 与高精度数字。JS 的 JSON 解析对超过
Number.MAX_SAFE_INTEGER的整数静默丢精度。我们的解析器检测这种(15+ 位整数、超过 17 位有效数字的科学计数法),并提供以字符串带"_bigint:..."标记保留——可选,因为多数用户不关心。 - UTF-8 BOM 处理。让 30% 在线转换器挂掉的 Excel 导出"带 BOM 的 CSV"在这里能正常工作——输入时检测并剥离字节序标记,勾选"Excel 兼容"时输出时可选地再加回。
全部编译为单一约 400 KB(gzip)的 JS bundle,首次访问加载;之后所有转换瞬时(几 MB 内的文件亚毫秒级)。
常见问题
Q:把嵌套 JSON 转 CSV 为什么会丢数据?
A:CSV 本质上是二维表。嵌套 JSON({a: {b: {c: 1}}})没有原生 CSV 表示。我们的工具给两种策略:扁平化(产出 a.b.c 这样的列)或炸开(一行一叶——通常不是你想要的)。请刻意选择;不存在"正确"答案。
Q:CSV 单元格里有逗号能处理吗?
A:能——我们遵循 RFC 4180。含逗号、换行或双引号的单元格自动用 "..." 包裹,内部引号变 ""。与 Excel、Google Sheets、Python csv 模块一致。
Q:能在浏览器里用 JSON Schema 校验 JSON 吗?
A:能。JSON 格式化器 有一个 Schema 标签,粘入 schema,工具给出内联校验错误。底层用 ajv(JS 最快的 JSON Schema 校验器)。
Q:我的 XML 有命名空间,转换后的 JSON 会保留吗?
A:会——带命名空间前缀的元素变成 "ns:elementName" 这样的 JSON 键;命名空间声明移到根上的 @xmlns 键。反向转换产出等价(格式可能不同)的 XML。
Q:你的解析器里 YAML 1.1 与 YAML 1.2 区别?
A:默认 YAML 1.2(修复挪威问题——NO 是字符串 "NO" 而非布尔 false)。要兼容老 Ruby 或 Symfony 配置中依赖遗留布尔速记的,可切到 YAML 1.1 模式。
Q:能一次批量把 100 个 CSV 转成 JSON 吗? A:能——把 100 个文件一起拖入,点击转换,得到一个 ZIP。每个文件在独立 Web Worker 中处理,多核机器并行跑。
现在就试
按你的需要挑:
- JSON 格式化器——校验、美化、最小化
- XML 转 JSON——保留命名空间与属性
- XML 转 CSV——把重复元素扁平成行
- CSV 转 Excel——产出真正的 .xlsx,不是改后缀的 CSV
- YAML 格式化器——校验配置文件
- Cron 解析器——用人话解释
0 */6 * * 1-5
浏览全部开发者工具箱。
相关阅读
- 永不上传你 Token 的 JWT 解码器——同样的架构,用于 JWT
- Cron 表达式解析器——给非运维同学——调度层
- Ai2Done 全工具一览
- 浏览格式工具枢纽或开发者工具枢纽
最后更新于 2026-06-14。所有格式转换工具 100% 在你的浏览器内运行——你的数据永远不会离开设备。我们不收集、不记录、不分析你处理的任何内容。