JSON、YAML、CSV:何时使用哪种格式以及如何转换
你下载了一个CSV格式的数据集。你的API返回JSON。你的配置文件是YAML格式。同事发给你一个JSON文件,希望你转成电子表格。另一个同事递给你一个YAML配置,你需要将其转为JSON用于另一个工具。
数据格式转换是那种看似简单、实际操作起来才发现并不容易的任务之一。了解何时使用哪种格式,以及如何在它们之间切换,能节省大量时间。
三种格式概览
JSON(JavaScript对象表示法)
{
"name": "Alice",
"age": 30,
"skills": ["Python", "SQL", "Docker"],
"address": {
"city": "Berlin",
"country": "Germany"
}
}
是什么: 一种文本格式的结构化数据,支持对象(键值对)、数组(有序列表)、字符串、数字、布尔值和null。
优势: 机器可读,每种编程语言都广泛支持,自然处理嵌套数据,严格的语法防止歧义。
劣势: 冗长(大量花括号、方括号和引号),可读性不如YAML,不支持注释。
YAML(YAML Ain't Markup Language)
name: Alice
age: 30
skills:
- Python
- SQL
- Docker
address:
city: Berlin
country: Germany
是什么: 一种人类友好的数据序列化格式,使用缩进代替花括号和方括号。它是JSON的超集,意味着有效的JSON也是有效的YAML。
优势: 极其可读,支持注释,视觉噪音少,非常适合配置文件。
劣势: 对缩进敏感(错误的空格容易出错),某些解析行为令人意外,解析速度比JSON慢。
CSV(逗号分隔值)
name,age,city,country
Alice,30,Berlin,Germany
Bob,25,London,UK
Charlie,35,Paris,France
是什么: 一种平面文本格式,每行是一条记录,行内的值由逗号(有时是分号或制表符)分隔。
优势: 通用(每个电子表格、数据库和数据工具都支持),表格数据紧凑,易于读取和创建。
劣势: 不支持嵌套数据,没有数据类型(一切都是字符串),特殊字符没有标准处理方式,仅限于平面表格。
你知道吗? YAML在技术上是JSON的超集。这意味着任何有效的JSON文档自动也是有效的YAML文档。你可以将JSON粘贴到YAML解析器中,它就能工作。反过来则不行——YAML的功能(注释、锚点、多行字符串)在JSON中没有对应物。
何时使用哪种格式
| 使用场景 | 最佳格式 | 原因 |
|---|---|---|
| API请求和响应 | JSON | 行业标准,每种语言都有原生支持 |
| 配置文件 | YAML | 人类可读,支持注释用于文档说明 |
| 电子表格数据 | CSV | 可直接在Excel、Google Sheets等中打开 |
| 数据库导出 | CSV | 平面表格数据直接映射到行和列 |
| 复杂嵌套数据 | JSON或YAML | CSV无法表示嵌套 |
| 系统间数据交换 | JSON | 解析无歧义,规范严格 |
| 人工编辑的配置 | YAML | 更易于手动读取和编辑 |
| 简单数据列表 | CSV | 轻量,无额外开销 |
格式之间的转换
JSON转YAML
这是最常见的配置转换。你有一个工具的JSON配置,另一个工具需要YAML。由于YAML支持JSON的所有功能,转换非常直接。
{"server": {"host": "0.0.0.0", "port": 8080}}
变为:
server:
host: 0.0.0.0
port: 8080
YAML转JSON
从YAML转到JSON也很简单,但你会丢失注释(JSON不支持注释),结果也更加冗长。
JSON转CSV
这对平面JSON数组(具有相同键的对象数组)效果很好。每个对象成为一行,每个键成为一个列标题。
[
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25}
]
变为:
name,age
Alice,30
Bob,25
警告 当JSON包含嵌套对象或数组时,JSON转CSV的转换会遇到问题。CSV是平面的——它无法表示"skills"数组或嵌套的"address"对象。嵌套数据必须被扁平化(address.city、address.country作为单独的列)或在CSV单元格中序列化为字符串。
CSV转JSON
每行变成一个对象,列标题作为键。对于简单的表格数据,这很干净。
CSV转YAML
不太常见,但遵循相同的逻辑:每行变成一个YAML映射,整个文件变成一个YAML序列。
常见陷阱
CSV编码问题
CSV文件可以使用不同的字符编码(UTF-8、Latin-1、Windows-1252)。如果你打开CSV后看到乱码字符如"München"而不是"München",那就是编码不匹配。尽可能使用UTF-8。
CSV分隔符混淆
并非所有CSV都使用逗号。欧洲的CSV经常使用分号,因为在许多欧洲数字格式中逗号用作小数分隔符。制表符分隔值(TSV)是另一种常见变体。
YAML缩进错误
YAML使用缩进(空格,绝不是制表符)来定义结构。不一致的缩进,或混用制表符和空格,会产生解析错误或无声的误解。每个缩进级别使用恰好2个空格,并配置你的编辑器插入空格而非制表符。
警告 在YAML中,字符串no会被解析为布尔值false,而yes会被解析为true。字符串1.0会被解析为数字。如果你想表示字面字符串"no"、"yes"或"1.0",你必须加引号:"no"、"yes"、"1.0"。这是YAML最臭名昭著的陷阱之一。
JSON尾逗号
JSON不允许尾逗号。这在JavaScript中有效,但在JSON中无效:
{"name": "Alice", "age": 30,} // 无效JSON:尾逗号
大文件性能
对于非常大的数据集(数百万行),CSV比JSON或YAML更高效,因为它每条记录的开销最小。JSON为每个值添加花括号和引号,这显著增加了大型表格数据的文件大小。
转换实用工具
对于快速的一次性转换,浏览器端工具是最快的选择。你粘贴或上传数据,选择目标格式,立即获得结果。
提示 在JSON、YAML和CSV格式之间即时转换:如何转换数据格式。粘贴你的数据,选择目标格式,复制或下载结果。
专门处理JSON时,一个能验证和美化JSON的格式化工具非常宝贵:
- JSON格式化工具 — 验证、格式化和压缩JSON
- JSON转CSV转换器 — 将JSON数组转换为CSV
- YAML-JSON转换器 — 在YAML和JSON之间转换
- CSV查看器 — 查看和浏览CSV文件
现在就转换你的数据:
所有工具都是免费的,直接在你的浏览器中运行。