JSON / YAML / CSV 互转完整指南:格式选型 + 迁移技巧
对比 JSON、YAML、CSV 三种数据格式的本质差异,深入讲解嵌套深度、类型表达、何时该用谁,以及互转中的常见坑点与解决方案。
互联网时代,数据在 JSON、YAML、CSV 三种格式之间频繁流转。JSON 是 API 通信之王,YAML 统治配置文件,CSV 掌控表格数据导入导出。但它们并非简单的表层不同——本质上是为不同场景设计的三套体系,各自有独特优势与局限。本文深入对比三种格式的设计理念、适用边界与互转技巧,帮你快速定位用哪个、何时互转、怎样避免数据丢失,掌握实战常见坑点与方案。
三种格式的本质定位
JSON 是通用的数据交换标准,基于键值对和数组,天生支持无限嵌套,但语法严格(强制双引号、禁止尾随逗号)。任何支持 JSON 的编程语言都能无缝解析,是互联网通信的标准格式。YAML 是人类友好的配置语言,用缩进表达结构,自动推断类型(yes/no 识别为布尔值),适合开发者手写配置文件,减少大括号和引号的视觉噪音。CSV 是表格数据的扁平化表示,一行一条记录,逗号分隔字段,没有嵌套的概念,与 Excel 无缝兼容。三者就像编程中的"运输方式":JSON 是飞机(快速、通用、成本高、跨界通用),YAML 是小车(舒适、易读、有限制),CSV 是货车(大量数据、只适合表格、零学习曲线)。
嵌套深度与数据模型差异
JSON 和 YAML 都支持任意深度的嵌套:{"user": {"address": {"city": "Beijing"}}} 或等价的 YAML 缩进结构。嵌套层数没有限制,理论上可以无限深。但 CSV 本质上是二维的——每行是一条记录,每列是一个字段。如果你的数据是 {"id": 1, "tags": ["ai", "tool"]},转成 CSV 就痛苦了:要么把 tags 数组展开成多行(破坏了原有的记录结构),要么把整个数组序列化成单个字符串字段。这不是 CSV 的设计缺陷,而是为了兼容电子表格而做的妥协。所以互转前,先问自己:数据的深度是多少?有数组吗?如果超过二维,CSV 会很难受。
类型表达与隐式推断
JSON 的类型非常显式:数字是 123、字符串是 "text"、布尔值是 true/false、null 是 null。这种严格的类型系统确保了跨语言的精确解析。YAML 会自动推断类型:123 自动成整数,true 自动成布尔,"123" 字符串必须加引号。这对配置文件很方便,但也容易出错。CSV 全部是字符串——123、true、2026-04-29 在 CSV 中都是文本,导入数据库或 JSON 时需要额外的类型转换步骤。这就是为什么 CSV 导入常出现"日期显示为数字"的问题:缺少类型元数据。YAML 和 JSON 都能保留类型信息,但 YAML 更宽松(有歧义),CSV 最严格(无类型)。
何时用 JSON、何时用 YAML、何时用 CSV
API 通信和数据存储用 JSON:REST API 响应、WebSocket 消息、NoSQL 数据库都是 JSON 的主场。因为 JSON 的类型系统明确,跨语言兼容性最好。应用程序配置用 YAML:Kubernetes、Docker Compose、CI/CD 流程(GitHub Actions、GitLab CI)都用 YAML。因为 YAML 对人类最友好,配置文件通常被非开发者修改,缩进结构比 JSON 的大括号更直观。表格数据导入导出用 CSV:数据库导出、电子表格、CRM 系统数据都是 CSV 的天下。因为 CSV 与 Excel/Google Sheets 无缝集成,是跨平台的表格通用格式。
JSON → YAML 互转的坑点
JSON 转 YAML 通常很顺利,因为 YAML 是 JSON 的超集,可以直接加缩进就行。但反向就难了:YAML 中的 true、yes、no、on、off 都被推断为布尔值,而 JSON 会把它们序列化成 true,字符串意义完全丢失。如果你的 YAML 配置有 password: yes,转成 JSON 会变成 "password": true,下游系统期望字符串但收到布尔值就崩溃了。解决办法是在 YAML 中用引号强制指定为字符串:password: "yes"。另一个坑是 YAML 的特殊字符(@、*、&、|)在 JSON 中可能有歧义,需要谨慎转换,甚至需要 escape。
CSV 互转的常见陷阱
CSV 最大的坑是字段内包含逗号:如果字段值是 "Smith, John",必须用双引号包裹整个字段:"Smith, John"。如果字段内有引号,比如 say "hello",得用双双引号转义:say ""hello""。很多人不知道这个规则,导致互转时字段错位。另一个大坑是换行符:CSV 中的字段可以包含 \n(换行),但整个字段必须用双引号包裹:"name\nJohn"。电子表格软件(Excel、Google Sheets)会直接显示为多行单元格,但纯文本工具会误判。编码问题也很常见:CSV 的默认编码因操作系统而异。Windows Excel 用 GBK(中文)或 CP1252(西文),Mac 用 UTF-8。导入时如果编码选错,中文就变成乱码。正确做法是导出为"UTF-8 with BOM"(Byte Order Mark),这样 Excel 自动识别为 UTF-8。
实战互转工具与命令行方案
本工具 /data-convert/ 提供可视化互转三种格式,自动处理编码、转义、类型推断,提供预览和验证功能。用户上传一个文件,选择目标格式,秒速得到转换结果,并能下载或复制。对于日常使用,无需学习命令行。命令行方案有 jq(JSON 处理)、yq(YAML 处理)、Miller(CSV 处理),它们可以链式调用进行复杂转换。比如 jq . input.json | yq -P - 可以把 JSON 转成 YAML,miller --json2csv input.json > output.csv 可以把 JSON 转成 CSV。但这些工具有学习曲线,对于快速互转和验证,可视化在线工具更直观、更安全。
常见问题
CSV 能表达嵌套数据吗?
不能。CSV 是二维表格,无法直接表达嵌套结构。如果你的数据是嵌套的(如 user.address.city),可以把嵌套路径展开为单列(如 user_address_city),但这样会失去结构信息。如果必须保留嵌套,应该用 JSON 或 YAML,或者用逗号分隔的路径语法(但需要自定义解析)。
YAML 的缩进必须是 2 个空格吗?
不强制,但约定俗成是 2 个空格。YAML 规范允许任意缩进,但同一层级必须对齐。用 Tab 会导致很多 YAML 解析器报错。所以最佳实践是一律 2 个空格,保证兼容性。很多编辑器都有快速转换 Tab 为空格的选项。
JSON 转 CSV 后数据是否会丢失?
可能会。如果 JSON 包含嵌套对象或数组,转成 CSV 后信息会序列化成字符串(比如整个对象变成 [object Object])。反向导入回 JSON 时无法恢复原有结构。所以 CSV 互转只适合扁平化的表格数据,嵌套数据应该用 JSON 或 YAML。
CSV 文件很大(百万级行),怎么处理?
本工具支持分页加载,但如果超过浏览器内存限制,建议用服务端脚本(Python pandas、Node.js csv-parser)流式处理。或者用 Miller、awk 等命令行工具做分片、过滤、统计,再导入 CSV。大文件处理不适合在浏览器中一次性加载。
互转后如何验证数据完整性?
最稳妥的方法是对比原始和转换后数据的行数、列数和关键字段的哈希值。本工具的预览功能可以看样本数据,但全量验证需要脚本。如果数据包含关键字段(如 ID),可以先提取这些字段做对比,确保没有丢失或重复。
YAML 配置中的多行字符串怎么表达?
YAML 有两种多行语法:| 保留换行符和尾部空行,> 折叠换行符(连续行视为一行)。比如 description: | 会换行显示,description: > 会连接成一行。选择哪个取决于你的配置是否需要保留原始换行。JSON 和 CSV 都用 \n 表示换行。