一位DevOps工程师将Kubernetes配置导出为YAML,但需要发送给一个只接受JSON的API。一位分析师收到JSON格式的API响应数据,但需要放入电子表格。一位数据科学家从数据库导出CSV,但需要结构化的JSON用于Web仪表盘。
格式转换不仅仅是机械操作。每种格式都有不同的取舍,理解转换中丢失了什么与知道如何转换同样重要。
三种格式,三种哲学
每种格式都是为不同的受众和不同的问题设计的:
| 格式 | 诞生 | 设计目的 | 核心哲学 |
|---|---|---|---|
| CSV | ~1972 | 程序间数据交换 | 最大简洁性 — 只有行和列 |
| JSON | 2001 | Web数据交换 | 具有严格规则的机器可读结构化数据 |
| YAML | 2001 | 配置文件 | 具有最少语法的人类可读结构化数据 |
CSV假设你的数据是一个平面表格。每个值都是字符串。没有嵌套、类型或元数据的概念。
JSON假设你的数据具有结构 — 对象、数组、类型(字符串、数字、布尔值、null)。它严格且无歧义,这使它对机器来说是理想的,但对人类来说很冗长。
YAML假设人类会读取和编辑文件。它使用缩进代替花括号,支持注释,语法更宽松。从技术上讲,YAML是JSON的超集 — 任何有效的JSON文档也是有效的YAML。
YAML是JSON的超集 你可以将JSON文档直接粘贴到YAML解析器中,它会正常工作。反过来则不行 — 注释、锚点和多行字符串等YAML特性在JSON中没有对应物。
实际转换场景
配置迁移(JSON转YAML,YAML转JSON)
这是最常见的转换。不同工具期望不同的配置格式:
- Docker Compose、Kubernetes、GitHub Actions、Ansible使用YAML
- package.json、tsconfig.json、ESLint使用JSON
- 在工具之间迁移通常意味着转换配置
此转换在数据内容上双向无损 — 但由于JSON没有注释语法,转换为JSON时YAML注释会丢失。
数据分析(JSON转CSV)
API响应以JSON格式返回。分析师需要电子表格。此转换对扁平JSON数组效果良好 — 具有相同键的对象数组自然映射为行和列。
但遇到嵌套数据就会出问题。具有address.city字段和skills数组的JSON对象没有自然的CSV表示。转换器必须做出选择:展平嵌套键(address.city变成一列)、将嵌套值序列化为字符串,或丢弃它们。
数据导入(CSV转JSON)
反向场景:将电子表格数据导入Web应用或API。CSV转JSON创建以列标题为键的对象数组。问题是CSV没有类型信息 — 数字42、字符串"42"和布尔值true在CSV中都只是文本。转换器必须猜测类型。
可读性提升(JSON转YAML)
有时你只需要让密集的JSON配置文件变得可读。转换为YAML可以获得清晰的缩进和添加注释用于文档说明的能力。这对于团队维护的大型配置文件特别有价值。
转换中丢失了什么
这是节省调试时间的关键知识:
| 转换 | 丢失的内容 |
|---|---|
| YAML转JSON | 注释(JSON没有注释语法) |
| JSON转CSV | 嵌套(CSV是扁平的)、类型(一切变成文本)、数组 |
| CSV转JSON | 无(但类型需要推断 — "42" vs 42) |
| CSV转YAML | 无(同样的类型推断问题) |
| JSON转YAML | 无(YAML是JSON的超集) |
| YAML转CSV | 注释、嵌套、类型、锚点/别名 |
规律很明显:向CSV方向的转换丢失最多信息,因为CSV是最简单的格式。JSON和YAML之间的转换几乎无损。而YAML注释在离开YAML时总是丢失。
双向与单向 JSON-YAML和YAML-JSON的转换实际上是双向的(除注释外可安全往返)。JSON-CSV和YAML-CSV的转换对于复杂数据是单向的 — 你无法从扁平CSV重建嵌套结构。
转换时的常见陷阱
YAML的类型强制陷阱
YAML会自动将某些字符串解释为非字符串类型。no变成布尔值false。yes变成true。字符串1.0变成浮点数。像NO(挪威)这样的国家代码已经造成了著名的bug。在YAML中始终给歧义值加引号。
CSV分隔符和编码混乱
并非所有CSV都使用逗号。欧洲的CSV经常使用分号(因为许多欧洲数字格式中逗号是小数分隔符)。制表符分隔值(TSV)是另一种变体。而字符编码不匹配(UTF-8与Latin-1)会导致重音字符乱码。
JSON的尾随逗号问题
JSON不允许尾随逗号。这是有效的JavaScript:{"a": 1, "b": 2,} — 但它是无效的JSON。一个尾随逗号就会导致解析错误。
大数据集性能
对于数百万行的数据集,CSV比JSON或YAML高效得多。JSON为每个值添加花括号、方括号和引号。100万行的CSV可能是50MB;等效的JSON可能是150MB。
从一开始选择正确的格式
与其事后转换,不如一开始就选择正确的格式以避免信息丢失:
- 电子表格或数据库的表格数据 — CSV
- API或Web应用的结构化数据 — JSON
- 人类将编辑的配置 — YAML
- 带注释的复杂嵌套数据 — YAML
- 系统间的数据交换 — JSON
进一步了解
使用浏览器端工具在JSON、YAML和CSV之间即时转换:
- 转换数据格式 — 粘贴数据、选择目标格式、下载结果
- JSON格式化器 — 验证、格式化和压缩JSON
- JSON转CSV转换器 — 将JSON数组转换为适合电子表格的CSV
- YAML-JSON转换器 — 支持注释感知的YAML和JSON互转
