JSON 转 CSV 转换器

将 JSON 对象数组粘贴到左侧,得到正确加引号的 CSV。表头从对象键生成,本地运行 — 无需上传。

  1. 将 JSON 对象数组粘贴到左侧文本区。
  2. 点击「转换为 CSV」。表头由所有对象键的并集生成。
  3. 复制结果,或下载为 data.csv。
  4. 嵌套值会被 JSON 字符串化 — 若需要扁平列,请先在外部展平。
它能做什么?

将 JSON 对象数组转换为 RFC 4180 CSV。表头是所有对象键的并集。包含逗号、引号或换行的值会自动加引号。数字和布尔值不带引号输出;null 与 undefined 变成空字段。嵌套值(对象、数组)会被 JSON 字符串化为单个加引号字段 — CSV 不能原生表达层级。

示例

JSON 输入:

[
  {"name":"Ada","age":36,"role":"engineer"},
  {"name":"Grace","age":40,"role":"scientist"}
]

CSV 输出:

name,age,role
Ada,36,engineer
Grace,40,scientist

常见 JSON 转 CSV 陷阱

CSV 是扁平格式。多数「奇怪」的输出都来自无法用扁平结构表示的 JSON 形状。

  • 顶层不是数组。 JSON 对象 `{"a":1,"b":2}` 不能直接转 CSV — 用数组包起来: `[{"a":1,"b":2}]`。结果会有一行表头和一行数据。
  • 不同行键不一致。 若第一个对象有 `{a,b}`、第二个有 `{a,c}`,表头为并集 `a,b,c`。缺失键的行输出空字段。需要更严格的模式请先预处理。
  • 嵌套值被静默扁平化。 `{"address":{"city":"NY"}}` 这样的字段会变成单个 CSV 列,值是 JSON 字符串 `{"city":"NY"}`。如果想要分开的 `address.city` 列,请先在 JavaScript 里展平: `{address_city: row.address.city}`。
  • 值中嵌入换行。 JSON 值中的多行字符串会变成加引号的 CSV 字段,引号内含字面量 `\n`。多数表格软件能正确处理;一些老旧工具不行。
  • 表头含特殊字符。 含逗号、引号或换行的 JSON 键虽能工作,但部分 CSV 消费者解析时会出问题。需要最大兼容性时,转换前请把键名改为字母数字加下划线。
  • JSON 末尾的逗号。 `[{"a":1},]` 是无效 JSON(末尾元素后多了逗号)。解析器在 CSV 步骤之前就会拒绝。多数 JSON 格式化器会去掉它 — 必要时先过 `/json-prettifier`。
常见问题

如何获得制表符分隔输出(TSV)?

本页输出逗号分隔的 CSV。要 TSV,可把结果中的 `,` 替换为 `\t`,或在命令行用 `delimiter: "\t"` 调用 PapaParse — 同一个库。

表头里的键顺序会保留吗?

会。表头按键在所有对象中首次出现的顺序排列。需要按字母排序就在粘贴前先对 JSON 排序。

日期如何处理?

JSON 没有原生 Date 类型 — 日期通常已经被序列化为 ISO 8601 字符串,这些会原样通过。若 JSON 是通过 JSON.stringify 得到的 Date 对象,该处此前已转为 ISO 字符串。

能 JSON → CSV → JSON 来回转换吗?

对于扁平的「对象数组」数据可以。字符串保持字符串、数字保持数字(在 PapaParse 启用动态类型时)。嵌套值在 CSV 阶段丢失结构,回来时是 JSON 字符串字段而非嵌套对象。

我的 JSON 会被上传吗?

不会。一切都在浏览器里跑 — 你的 JSON 由本页 JavaScript 解析与转换,不发送到任何服务器。可在浏览器开发者工具中验证。

可以转多大的 JSON 文件?

约 50 MB 后浏览器文本框开始变慢。转换本身随输入线性扩展,瓶颈在渲染。更大文件请用命令行版 PapaParse。