JSON转CSV

将JSON数组转换为CSV格式

本地运行 · 粘贴密钥安全无忧
CSV将显示在这里…

什么是JSON转CSV转换?

JSON转CSV转换将结构化数据从JSON格式转换为逗号分隔值(CSV)——一种电子表格、数据库和分析工具原生支持的表格格式。JSON以嵌套对象和数组的形式存储数据,没有固定的结构定义。CSV以行和列的形式存储数据,通过标题行定义字段名称。这一转换是API数据进入电子表格和数据库的标准途径。

CSV(逗号分隔值)由RFC 4180定义。每行为一条记录,行内的字段由分隔符分隔,最常用的是逗号。包含分隔符、双引号或换行符的字段必须用双引号括起来,内部的双引号通过重复来转义。这种转义规则是手写JSON转CSV转换器时最常见的bug来源。

当输入是具有一致键名的扁平对象数组时,转换过程十分简单:每个对象变为一行,每个唯一键变为一列标题。嵌套对象和数组需要扁平化处理,而对象间键名不一致时则需要制定处理缺失字段的策略——通常是将该单元格留空。可靠的转换器会自动处理所有这些边界情况。

为什么要将JSON转换为CSV?

API返回JSON,但电子表格、SQL数据库和BI工具需要表格数据。将JSON转换为CSV可以在这些系统之间移动数据,无需编写自定义导入脚本。

即时浏览器转换
粘贴JSON即可立即下载文件。无需服务器上传,无外部API的文件大小限制,无需等待处理队列。
🔒
隐私优先处理
数据始终保留在你的浏览器中。转换完全在你设备上的JavaScript中运行。数据库导出、用户记录和财务数据永远不会离开你的设备。
🔀
多种分隔符支持
可在逗号、分号、制表符或竖线分隔符之间选择。在欧洲地区的电子表格中使用分号,在Unix工具使用的TSV文件中使用制表符,或在旧系统导入时使用竖线。
📋
无需账号
打开页面即可转换。无需注册、无需API密钥、无需安装CLI工具。在任何有现代浏览器的设备上均可使用。

JSON转CSV使用场景

导出API数据到电子表格
REST API返回JSON。产品经理和分析师需要将这些数据放入Excel或Google Sheets。将API响应转换为CSV,直接在任意电子表格应用中打开。
数据库批量导入
PostgreSQL的COPY、MySQL的LOAD DATA以及SQLite的.import命令均支持CSV。将数据集转换为表格格式,无需编写自定义导入脚本即可快速批量加载。
ETL流水线原型验证
ETL流水线的中间输出往往难以作为原始JSON来检查。将某一步骤的输出转换为CSV,在电子表格中打开,以便在接通完整流水线之前验证转换逻辑。
QA测试数据准备
QA工程师将测试夹具生成为JSON,但许多测试框架和数据驱动测试工具接受CSV作为参数化测试输入。无需手动重新格式化即可将夹具转换为CSV。
日志分析与报告
来自应用程序和云服务的结构化JSON日志可以转换为CSV,然后导入Tableau、Power BI或Looker等BI工具进行可视化和报告。
学术数据处理
使用开放数据API的学生和研究人员获得JSON响应。转换为CSV后,无需编写解析代码即可在R、pandas、SPSS或Excel中进行分析。

CSV分隔符参考

分隔符用于分隔每行中的字段。逗号最为常见,但在特定场景下其他分隔符也是标准选择。选错分隔符会导致打开文件时字段合并或拆分异常。

分隔符字符扩展名适用场景
Comma,.csvDefault for most spreadsheets and databases
Semicolon;.csvStandard in locales where comma is a decimal separator (DE, FR, BR)
Tab\t.tsvAvoids escaping when field values contain commas or semicolons
Pipe|.csvUsed in fixed-width legacy systems and some ETL pipelines

在CSV中处理嵌套JSON

CSV是一种扁平格式,没有原生方式表示嵌套对象或数组。当JSON包含嵌套结构时,转换器必须将其扁平化为列。有几种策略可供选择,正确的选择取决于CSV的使用方式。

点号表示法扁平化
嵌套键以点号连接:{"address": {"city": "北京"}} 变为列名 address.city,值为北京。这是最常见的方式,适用于支持嵌套字段引用的工具。
数组索引列
数组展开为带编号的列:{"tags": ["a", "b"]} 变为 tags.0 = a,tags.1 = b。这种方式保留所有值,但当数组较大时会产生大量列。
JSON字符串回退
复杂的嵌套值被序列化为CSV单元格中的JSON字符串:单元格包含原始JSON文本。这种方式保留完整结构,但需要消费方解析单元格值。
忽略嵌套字段
部分转换器完全丢弃嵌套对象和数组,仅保留标量(字符串、数字、布尔值、null)字段。输出的CSV较为简洁,但会丢失数据。仅在确认不需要嵌套字段时使用。

代码示例

以编程方式将JSON转换为CSV需要处理标题提取、字段引用和分隔符转义。大多数编程语言提供了内置或标准库的CSV写入支持。

JavaScript (Node.js)
const data = [
  { name: "Alice", age: 30, city: "Berlin" },
  { name: "Bob", age: 25, city: "Tokyo" },
]

// Extract headers from the first object
const headers = Object.keys(data[0])
const csv = [
  headers.join(","),
  ...data.map(row => headers.map(h => {
    const val = String(row[h] ?? "")
    // Quote fields that contain commas, quotes, or newlines
    return val.includes(",") || val.includes('"') || val.includes("\n")
      ? '"' + val.replace(/"/g, '""') + '"'
      : val
  }).join(","))
].join("\n")

console.log(csv)
// → name,age,city
// → Alice,30,Berlin
// → Bob,25,Tokyo
Python
import json, csv, io

json_str = '[{"name":"Alice","age":30,"city":"Berlin"},{"name":"Bob","age":25,"city":"Tokyo"}]'
data = json.loads(json_str)

output = io.StringIO()
writer = csv.DictWriter(output, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)

print(output.getvalue())
# → name,age,city
# → Alice,30,Berlin
# → Bob,25,Tokyo
CLI (jq + Miller)
# Using jq to convert JSON array to CSV
echo '[{"name":"Alice","age":30},{"name":"Bob","age":25}]' | \
  jq -r '(.[0] | keys_unsorted) as $k | $k, (.[] | [.[$k[]]] ) | @csv'
# → "name","age"
# → "Alice",30
# → "Bob",25

# Using Miller (mlr) for streaming conversion
echo '[{"name":"Alice","age":30}]' | mlr --json --ocsv cat
# → name,age
# → Alice,30
Go
package main

import (
    "encoding/csv"
    "encoding/json"
    "fmt"
    "os"
)

func main() {
    jsonStr := `[{"name":"Alice","age":30},{"name":"Bob","age":25}]`
    var data []map[string]interface{}
    json.Unmarshal([]byte(jsonStr), &data)

    w := csv.NewWriter(os.Stdout)
    // Write header
    headers := []string{"name", "age"}
    w.Write(headers)
    // Write rows
    for _, row := range data {
        record := make([]string, len(headers))
        for i, h := range headers {
            record[i] = fmt.Sprintf("%v", row[h])
        }
        w.Write(record)
    }
    w.Flush()
    // → name,age
    // → Alice,30
    // → Bob,25
}

常见问题

此转换器需要什么JSON结构?
转换器需要一个JSON对象数组,例如 [{"name":"张伟"},{"name":"李娜"}]。数组中的每个对象变为输出的一行,对象的键变为列标题。单个JSON对象(未包裹在数组中)会被视为只有一行的表格。
嵌套对象和数组如何处理?
嵌套值使用点号表示法进行扁平化。例如,{"address":{"city":"北京"}'} 生成列名 address.city。数组展开为带索引的列(tags.0、tags.1)。这种方式在保留数据的同时保持输出扁平。
当对象具有不同的键时会发生什么?
转换器收集数组中所有对象的全部唯一键,并将其用作列标题。缺少某键的对象在该列对应单元格为空。数据不会丢失,列顺序按键首次出现的顺序排列。
可以使用分号或制表符代替逗号吗?
可以。工具支持逗号、分号、制表符和竖线分隔符。当你的数据或地区设置使用逗号作为小数分隔符时(德语、法语和巴西葡萄牙语电子表格中常见),请使用分号。对于Unix工具使用的TSV文件,请使用制表符。
转换是无损的吗?
对于具有一致标量值的扁平JSON数组,是的。输出文件包含相同的数据,可以转换回完全相同的JSON。对于嵌套结构,扁平化会改变数据的形状。序列化为带索引列或JSON字符串的数组值可以重建,但往返转换需要了解原始结构。
可以转换多大的JSON文件?
工具在浏览器中运行,在内存中处理数据——在现代设备上,10到20 MB以内的文件转换不会有问题。对于更大的文件,请使用CLI工具,如 jq、Miller 或带有 csv 模块的Python脚本,这些工具以流式方式处理数据。
将敏感数据粘贴到此工具中安全吗?
安全。所有处理均在你的浏览器中使用JavaScript完成。没有任何数据发送到服务器。你可以打开浏览器的开发者工具,在转换过程中查看网络标签,确认没有任何网络请求发出。