无需上传, 100% 本地处理, 无需账户

文章

在 CSV、XML、JSON 和 YAML 之间转换:实用指南

CSV、JSON、XML 和 YAML 是开发者在数据管道、配置文件和 API 中最常接触的四种格式。当数据模型匹配时,格式转换非常直接;而当数据模型不匹配时,信息丢失往往出乎意料。本文介绍每种格式能表示和不能表示的内容、转换过程中信息消失的位置,以及可能导致静默损坏的编码陷阱。本站的 data-converter 工具可在浏览器中完整处理其中三种格式(CSV、JSON 和 YAML);本文中涉及 XML 的部分仅作为背景知识,供你手动或借助其他工具迁移数据时参考。

四种格式及其数据模型

CSV 将数据组织为由行和列构成的平面网格。第一行通常用于命名列,后续每行代表一条记录。CSV 没有嵌套、没有类型信息,也没有超出纯文本单元格的标准规范。除非上层应用强制指定类型,否则所有值均为字符串。 JSON 将数据建模为由对象(键值映射)和数组构成的树状结构。值可以是字符串、数字、布尔值、null、嵌套对象或任意深度的数组。这使得单个 JSON 文档可以表示一条客户记录,其中包含嵌套的地址对象、行项目数组和具有类型的数值合计。 XML 将数据建模为元素树。每个元素可以携带命名属性,并包含子元素或文本内容。XML 没有内置的数字或布尔类型,所有内容均为文本。XSD 等模式可在验证时强制类型约束,但传输格式始终是字符数据。 YAML 使用缩进表达与 JSON 相同的对象和数组模型,语法更适合人阅读。YAML 是 JSON 的超集:任何有效的 JSON 文档同样是有效的 YAML。YAML 还支持多行字符串、注释以及用于重复块的锚点别名引用。YAML 常用于配置文件,JSON 则常用于 API 响应。

并排显示四种数据模型的示意图:CSV 为平面网格,JSON 为带有类型值的嵌套对象树,XML 为带有属性的元素树,YAML 为缩进块结构

有损转换:扁平化与 XML 的歧义性

最常见的有损转换是将嵌套的 JSON 或 XML 扁平化为 CSV。带有嵌套地址字段的 JSON 对象无法直接映射到一行 CSV 中。常见的解决方法是使用点符号列名:customer.address.city 成为独立的一列。这对一层嵌套有效,但当出现数组时就完全失效了。一个有三个电话号码的客户,要么需要三个独立列(硬编码最大数量),要么拆分为第二个 CSV 文件,要么将数组编码为单个单元格内的分隔字符串。这些方案均无法在没有额外元数据的情况下还原为原始 JSON。 XML 引入了另一种歧义:属性与子元素的选择。值 Paris 可以存储为属性(<city name="Paris">),也可以存储为子元素(<city><name>Paris</name></city>)。当转换器读取 XML 并生成 JSON 时,必须决定如何映射属性。常见的约定包括给属性键添加 @ 前缀,或将其放在 "_attributes" 键下。这一选择没有标准化,这意味着两个转换器读取同一 XML 可能产生结构不同的 JSON。如果计划在 XML 和 JSON 之间来回转换,请在开始前确定一种约定。

CSV 的陷阱:分隔符、引号与编码

CSV 没有单一的正式标准,只有 RFC 4180 作为被广泛引用的参考。最常见的分隔符是逗号,但分号(在以逗号作为小数分隔符的欧洲地区很常见)、制表符(TSV)和竖线符也在实际中出现。一个 .csv 文件可能使用其中任何一种分隔符,而文件本身不会标明使用哪种。 当字段值本身包含分隔符时,RFC 4180 要求将该字段用双引号括起来:"San Francisco, CA"。引号字段内的双引号必须通过加倍来转义:"He said ""hello"""。包含字面换行符的字段也必须加引号。不执行此步骤的解析器会产生难以追踪的行数错误。 编码是另一个陷阱。来自 Windows 工具的 CSV 文件通常带有 UTF-8 BOM(字节顺序标记:文件开头的三个字节 EF BB BF)。BOM 帮助 Excel 识别编码,但许多编程语言解析器会将 BOM 视为第一列名称的一部分,导致列名变为 "id" 而不是 "id"。这会破坏任何按名称查找列的下游代码。以编程方式读取 CSV 文件时,应在解析前去除 BOM,或使用能显式处理 BOM 的库。

CSV 引号规则示意图:包含逗号的字段用双引号括起,包含双引号的字段通过加倍转义,以及在十六进制视图中高亮显示的文件开头 UTF-8 BOM 字节序列

选择格式:配置文件、数据交换与电子表格

格式选择通常由使用场景决定,而非个人偏好。 JSON 是 REST API 和浏览器与服务器之间数据交换的默认格式。它紧凑,每种编程语言都能原生解析,并为数字和布尔值提供类型信息。其弱点是不支持注释,这使它不适合开发者需要手动阅读和编辑的文件。 YAML 是配置文件(Kubernetes 清单、CI 管道定义、Ansible playbook)的首选,因为它支持内联注释,且在多层缩进时比 JSON 更易读。主要风险在于缩进错误是静默的:缩进错误的键会移到不同的作用域,但不会产生任何解析错误。 XML 在较旧的企业系统、SOAP Web 服务、文档格式(DOCX、SVG、RSS)以及需要模式验证或命名空间消歧的场景中仍是标准。它很冗长,但 XPath 和 XSLT 工具链已相当成熟。 CSV 适用于数据确实是平面结构,且消费方是电子表格应用或数据分析师的场景。由于 CSV 没有类型系统也不支持嵌套,它不适合用于配置文件或 API 数据交换。

使用 data-converter 在本地完成转换

本站的 data-converter 工具可在浏览器内完整解析和转换 CSV、JSON 与 YAML,不读取也不写入 XML;全程不向服务器传输任何数据。转换在本地 JavaScript 运行时执行,输出结果可直接下载或复制,数据不会离开您的设备。 对于不属于您可以共享的数据,这一点尤为重要:包含个人信息的 API 响应、带有内部主机名的配置文件,或从内部数据库导出的 CSV。将这些数据粘贴到在服务器上运行的在线转换器,意味着内容会通过网络发送,并在您无法控制的硬件上处理。使用 data-converter,浏览器标签页就是处理环境。 该工具在读写 CSV 时遵循 RFC 4180 引号规则;从 JSON 或 YAML 转换为 CSV 时,需要一个扁平的对象数组:某个键下的嵌套对象或数组值不会被自动做点符号扁平化,如果你需要把它们变成独立的列,请自行先扁平化这些字段。如果你需要与 XML 互相转换数据,请先用专门的 XML 工具把它转换为 JSON 或 YAML,再拿到这里处理。

本文涉及的工具

常见问题

我能将 JSON 转换为 CSV 再还原回原始 JSON 吗?

只有当 JSON 是由无嵌套字段、无数组值的对象构成的平面数组时才可以。一旦存在嵌套对象或数组值,CSV 表示就需要做出结构决策(点符号列、多行或编码字符串),这些决策无法自动反转。如果您的数据有嵌套,JSON、XML 或 YAML 可以完整还原;CSV 不行。

为什么从欧洲应用导出后,我的 CSV 在 Excel 中显示异常?

欧洲地区通常使用分号作为 CSV 分隔符,因为逗号被用于十进制表示。欧洲地区设置的 Excel 默认期望分号。如果文件使用逗号,Excel 会将整行视为单列。解决方法是在导出设置中更改分隔符,或使用 Excel 的数据导入向导手动指定分隔符。UTF-8 BOM 问题是另一回事:没有 BOM 时,Excel 也可能将带重音符号的字符显示为乱码。

YAML 和 JSON 在实际使用中有何区别?

两者表示相同的底层数据模型:对象、数组、字符串、数字、布尔值和 null。YAML 增加了注释(以 # 开头的行)、多行字符串字面量以及用于重复块的锚点引用。JSON 严格上是有效 YAML 的子集,但 JSON 解析器无法读取 YAML。实用规则:API 载荷和数据存储使用 JSON;人工编辑且受益于内联注释的配置文件使用 YAML。