结构化数据格式对照速查

6 个速查板块 · 关联 6 款站内工具 · 数据最后核对 2026-10-05

CSV、JSON、YAML、TOML、XML、INI 各自适合什么场景、能不能写注释、有哪些踩过一次就再也不会忘的坑。

同样的数据可以用很多种格式表达,差异往往体现在三件事上:能不能写注释、类型是不是显式、层级怎么表达。这三件事决定了它更适合做「配置文件」还是「数据交换」,也决定了团队协作时会不会互相踩坑。

一个实用的分类法:给人写的(YAML、TOML、INI)优先可读性与注释;给程序传的(JSON、JSONL、XML)优先严格与可解析;表格数据(CSV、TSV)优先体积与通用性。下面先给总览对照,再逐格式说清坑在哪里。

1总览对照

先看四列:能不能写注释、是否显式声明类型、是否天然支持层级、以及典型用途。

格式注释类型层级典型用途
CSV不支持全部是字符串,靠约定仅两维(行 / 列)表格数据交换、导出给 Excel
TSV不支持同上仅两维数据里含逗号时替代 CSV
JSON不支持有,但数字不分整型与浮点支持嵌套对象与数组接口传输的事实标准
JSONL不支持同 JSON每行一个独立对象日志、流式处理、批量导入
YAML支持 #隐式推断(易误判)靠缩进表达编排配置、CI 流程
TOML支持 #显式且严格用 [table] 分段应用配置,如各类包管理文件
XML支持 <!-- -->全部为文本,可加 Schema 校验支持嵌套与属性政务、金融等要求严格校验的老系统
INI支持 ; 或 #全部为字符串仅两维(节 / 键)简单配置,如部分桌面软件与系统文件

2CSV:规范很少,坑很多

CSV 看起来最简单,实际上「简单」正是它的问题来源——很多细节没有唯一答案,各家工具的默认行为并不一致。RFC 4180 给出了一个参考定义。

分隔符与换行
标准用逗号分隔、CRLF 换行;但很多工具接受分号(欧洲区域)或制表符(即 TSV),解析时需先确认
引号规则
字段里含分隔符、引号或换行时必须用双引号包裹;字段内的双引号用两个双引号表示("")
编码与 BOM
给 Excel 打开的中文 CSV 建议带 UTF-8 BOM,否则 Excel 会按本地编码解释而乱码
前导零与长数字
0755、13800138000 这类内容可能被 Excel 自动转成数字,前导零丢失、长数字变科学计数法。导出时应明确说明字段类型,或改用带引号的形式
首行表头
惯例是第一行为列名,但规范并未强制;对接时要确认
不要手工拼接
用字符串拼 CSV 几乎必然出错(引号、换行、分隔符)。使用标准的 CSV 库写入与解析

3JSON 与它的三条硬规则

JSON 的严格性正是它在接口场景胜出的原因。它的三条硬规则经常把从 JavaScript 对象字面量复制过来的内容判为非法。

不允许注释
JSON 里写 // 或 /* */ 都是非法语法。需要注释的场景应改用 JSON5、JSONC 或 YAML
不允许尾随逗号
{"a":1,} 非法。这在手写配置时是最高频的错误
不允许特殊数值
NaN、Infinity 在标准 JSON 中不合法,需要改成字符串或 null
键名必须双引号
{a: 1} 非法,必须是 {"a": 1}
数字类型不分家
JSON 只有一种数字类型,1 与 1.0 在解析后可能都变成同一个值;需要区分时用字符串
大整数精度
超过 2 的 53 次方的整数在 JavaScript 里会丢失精度,长 ID 建议用字符串传输

4YAML 与 TOML:给人类读的两种思路

两者都常用于配置,但取向完全不同:YAML 追求紧凑与表达力,TOML 追求无歧义。这一点决定了它们的风险差异。

对比项YAMLTOML
语法基础缩进(禁止用 Tab)显式的 [section] 与 key = value
类型推断会推断,因此存在歧义写什么类型就是什么类型
经典陷阱NO 被解析成布尔 false;1.20 变成数字 1.2(版本号被吃掉末尾零)几乎没有歧义陷阱,代价是写法略啰嗦
多行文本支持 | 与 > 两种块写法支持多行基本字符串
适用场景层级深、结构灵活的编排文件扁平、以配置项为主的工程文件

YAML 的「挪威问题」很有名:因为挪威的国家代码在 YAML 1.1 的类型规则里与布尔值 `false` 冲突,一个本意是国家代码的 `NO` 会被解析成假值。写 YAML 时凡是不确定的字符串,加引号最保险。

5XML 与 JSONL 各自的位置

这两个格式常被误认为「过时」或「冷门」,实际上在特定场景里它们仍是首选。

XML 的优势在约束
配合 XSD 可以做严格的结构校验,命名空间能避免字段冲突,还有成熟的签名与加密规范。政务、金融、出版行业仍大量使用
XML 的代价在体积
标签成对出现,同样数据量下体积通常是 JSON 的数倍,且解析开销更大
JSONL 的优势在流式
每行一个独立完整的 JSON 对象,可以逐行读取、逐行处理,不需要把整个文件载入内存
JSONL 的典型场景
日志文件、大数据批量导入(许多数据库与分析工具支持直接读 JSONL)、模型训练数据
JSONL 的注意事项
文件整体不是合法 JSON,不能用 JSON.parse 直接解析;每行之间不能有半个对象;换行符必须规范
JSON 与 JSONL 的取舍
数据要整体交给一个接口就用 JSON 数组;要按行追加、按行处理就用 JSONL

6怎么选:三个判断问题

这份数据是给程序还是给人读的?
给程序读优先 JSON(通用、库最多);给人读优先 YAML 或 TOML
需要注释吗?
需要持久保存的解释性说明 → YAML / TOML / INI;JSON 无法做到,只能另存文档
是表格还是树?
行列表格用 CSV / TSV;含嵌套结构用 JSON / YAML / TOML;需要严格校验的旧系统对接用 XML

关于「结构化数据格式对照速查」的常见问题

JSON 和 YAML 该用哪个?

看目标是「机器交换」还是「人工维护」。JSON 语法严格、几乎所有语言都有内置解析器、不易产生歧义,是接口传输与数据存储的默认选择;但它不支持注释、不允许尾随逗号,手写容易出错。YAML 支持注释、写法紧凑,适合层级较深的配置文件,但类型推断会带来歧义(比如 NO 被当成布尔假、版本号 1.20 被截成 1.2)。所以常见组合是:接口与存储用 JSON,可读性优先的配置用 YAML,配置项平坦、要求无歧义的工程文件用 TOML。

为什么我的 JSON 一直被判定格式错误?

按出现频率排查四点:一是写了注释(// 与 /* */ 在标准 JSON 中都不合法);二是最后一个元素后面留了尾随逗号;三是键名没有加双引号;四是出现了 NaN 或 Infinity。另外注意从 JavaScript 对象字面量复制过来的内容,即使浏览器里能跑,也可能不是合法 JSON。用格式校验工具格式化一遍,报错位置会直接指出问题所在。

CSV 打开后长数字变成科学计数法或前导零消失怎么办?

这是 Excel 等表格软件把内容自动识别成数字导致的:13800138000 变科学计数法,0755 变成 755。解决办法有三类:一是导出时把该列写成带引号的文本形式并明确标注为文本;二是改用「数据 → 从文本/CSV 导入」,在向导中把该列指定为文本类型;三是干脆改用 Excel 原生格式(xlsx)传递。如果只是给人看,可以在字段前加一个制表符或单引号强制文本,但这会污染数据本身。

JSONL 和 JSON 有什么区别?

JSON 是整个文件表示一个 JSON 值(通常是一个数组或对象),必须完整读入才能解析;JSONL(也叫 NDJSON)是每行一个独立完整的 JSON 对象,可以一行一行地读取和处理,不需要把整个文件载入内存。所以 JSONL 特别适合日志、流式数据和大批量导入。要注意的是 JSONL 文件整体并不是合法 JSON,不能用普通的 JSON 解析器直接解析,必须按行拆开;同时每行之间不能出现跨行的对象。

内容标识:本页内容由人工智能辅助生成,并经人工核对与编辑。详见 人工智能生成内容标识说明。
内容说明:本页速查数据由本站自行整理,事实性内容以对应官方规范与文档为准,未复制第三方速查表或百科的表述。数据最后核对日期:2026-10-05。若发现错误或已更新的标准,欢迎通过页脚反馈入口告知。