我编写的第一台 JSON 到 CSV 转换器持续了三天的生产。
是"导出到电子表格"的Laravel管理面板中的按钮,而我的转换逻辑是- I'm对此并不感到自豪- values.join(",")。它通过测试航行。然后一个用户导出了一个客户列表,其中一家公司被命名为"史密斯,琼斯&合作伙伴,"并且它向右移动一个位置之后的每一列。他们的会计师在有人注意到电话号码在电子邮件列之前导入了340行未对齐的数据。
CSV中的逗号是't一个可以串联的分隔符。it's一个语法,定义在 RFC 4180,带有实际的转义规则。那个错误就是为什么 JSON 到 CSV 转换器 我后来为 toolz。dev 构建,将逃逸视为不可协商的 - 以及为什么本指南实时花在边缘案例上,而不仅仅是快乐的道路上。
以下是我实际使用的五种方法,每种方法获胜时以及每种方法咬合的位置。
TL;博士: 对于一次性转换,请将 JSON 粘贴到 Toolz.dev JSON 到 CSV 转换器--用点符号将嵌套对象压平, 每RFC 4180正确转义, 100%在浏览器中运行 对于重复出现的作业, 编写脚本:
pd.json_normalize()在 Python 或json2csv在节点中打包。通过。 json格式化程序 首先,保持原来的 JSON - CSV 平坦化是单向的。
当您已经拥有 JSON 时,为什么需要 CSV?
因为需要您数据的人不't住在您的终端。每次转换请求I've曾经得到减少到五种情况之一:
分析师在电子表格中工作。 Excel、谷歌表、Tableau、Power BI- 它们都原生吸入CSV,并扼杀嵌套的JSON。将API输出转换为CSV是工程数据到达业务端的方式。
数据库批量导入平面文件。 PostgreSQL's COPY 还有 MySQL's LOAD DATA want表格输入。json列存在,但加载到真实的关系表中意味着首先变平。
迁徙需要通用语言。 NoSQL 存储和关系存储之间,或者在两个 SaaS 平台之间移动数据,CSV 是两端可靠理解的格式。
合规性喜欢平面文件。 一些档案要求指定了人类可读的格式。 CSV 在任何事物中打开,几十年后。
利益相关者可以't 阅读 JSON。 A产品经理询问"我可以把它作为电子表格吗?"是最常见的单一触发器,它是我损坏的导出按钮的触发器。

是什么让 JSON 到 CSV 的转换变得困难?
Flat JSON 是微不足道的。这个:
[
{"id": 1, "name": "Alice", "email": "[email protected]", "age": 30},
{"id": 2, "name": "Bob", "email": "[email protected]", "age": 25}
]
became this, 标题的键, 行元素:
id,name,email,age
1,Alice,[email protected],30
2,Bob,[email protected],25
但真正的API响应从来都不是平的,它们看起来像这样:
[
{
"id": 1,
"name": "Alice",
"address": {"street": "123 Main St", "city": "San Francisco", "state": "CA"},
"skills": ["JavaScript", "Python", "Go"]
}
]
CSV没有"内部的概念。"所以你选择一个扁平化策略,每个都有成本:
点符号变平- 嵌套键成为复合标头:
id,name,address.street,address.city,address.state,skills
1,Alice,123 Main St,San Francisco,CA,"JavaScript; Python; Go"
数组的索引列- skills.0、 skills.1、 skills.2。可预测的,但一个有14个技能的记录为每个人制作了14个专栏。
JSON 编码的单元格-把原始的JSON塞进单元格,双引。无损,无法读取,这让分析师感到悲伤。
带有连接数组的点符号是人类消费的正确默认值 - it's what the Toolz.dev 转换器 product。indexed列在下游代码需要每个元素可寻址时获胜。json-in-cells是往返的最后手段。
方法 1:如何在线将 JSON 转换为 CSV?
最适合: 一次性转换,非开发人员,任何低于几十 MB 的产品。
- 打开 JSON 到 CSV 转换器。
- 粘贴您的 JSON - 对象数组或单个对象。
- 该工具检测结构,将嵌套对象压平为点表示法,并立即渲染 CSV。
- 复制它,或下载
.csv。
我默认此原因适用于任何非重复的脚本:零设置、正确的 RFC 4180 转义(学习了该课程)、跨不一致对象的自动密钥结合,以及 - 因为它's 客户端 - 充满客户电子邮件的 API 响应您刚刚粘贴的永远不会离开您的机器。如果您不这样做,请观看网络选项卡't 相信我;that's 我对每个在线转换器应用的测试,并且大多数都失败了。
Where it's错误的工具:反复转换(脚本它)和深层病态嵌套在你'll想手工挑选扁平化策略。

方法 2:如何在 JavaScript 中将 JSON 转换为 CSV?
最适合: 构建管道、节点服务、自定义转换逻辑。
Here's 最小正确版本 - 注意逃跑,这是我三天灾难跳过的部分:
function jsonToCsv(jsonArray) {
if (!jsonArray.length) return "";
const headers = Object.keys(jsonArray[0]);
const csvRows = [
headers.join(","),
...jsonArray.map(row =>
headers.map(header => {
const value = row[header] ?? "";
// RFC 4180: double embedded quotes, wrap anything containing , " or newline
const escaped = String(value).replace(/"/g, '""');
return /[,"\n\r]/.test(escaped) ? `"${escaped}"` : escaped;
}).join(",")
)
];
return csvRows.join("\n");
}
对于嵌套输入,首先压平并联合按键 - 仅从第一个对象获取标头是手摇转换器中第二常见的错误:
function flattenObject(obj, prefix = "") {
const result = {};
for (const [key, value] of Object.entries(obj)) {
const newKey = prefix ? `${prefix}.${key}` : key;
if (value && typeof value === "object" && !Array.isArray(value)) {
Object.assign(result, flattenObject(value, newKey));
} else if (Array.isArray(value)) {
result[newKey] = value.join("; ");
} else {
result[newKey] = value;
}
}
return result;
}
function nestedJsonToCsv(jsonArray) {
const flattened = jsonArray.map(item => flattenObject(item));
// Union of ALL keys, not just the first object's
const headers = [...new Set(flattened.flatMap(Object.keys))];
// ...then emit rows exactly as in jsonToCsv above
}
或者跳过手卷 - json2csv package 多年来一直处理这些边缘:
import { Parser } from "json2csv";
const parser = new Parser({ flatten: true });
const csv = parser.parse(data);
方法 3:如何在 Python 中将 JSON 转换为 CSV?
最适合: 数据科学工作流程,任何已经触及熊猫的东西。
熊猫单行包覆扁平 JSON:
import pandas as pd
df = pd.read_json("data.json")
df.to_csv("output.csv", index=False)
真正有用的功能是 pd.json_normalize()- 专为嵌套 API 响应而构建:
import pandas as pd
import requests
response = requests.get("https://api.example.com/users")
df = pd.json_normalize(response.json())
print(df.columns.tolist())
# ['id', 'name', 'skills', 'address.street', 'address.city', 'address.state']
# Arrays still need a decision — join them explicitly:
df["skills"] = df["skills"].apply(lambda x: "; ".join(x) if isinstance(x, list) else x)
df.to_csv("output.csv", index=False)
注意 json_normalize 扁平化嵌套 对象 但离开了 阵列 python 列表一样 - 如果您跳过连接步骤,则您的 CSV 单元格包含 ['JavaScript', 'Python'] 逐字逐句。每个人都打过一次。
没有熊猫可用?标准库处理平面 JSON 罚款:
import json, csv
with open("data.json") as f:
data = json.load(f)
with open("output.csv", "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)
方法 4:如何从命令行将 JSON 转换为 CSV?
最适合: shell脚本,ci管道,安装熊猫的服务器是过度杀伤。
jq 本地使用它 @csv,其正确逃逸:
cat data.json | jq -r '
(.[0] | keys_unsorted) as $keys |
($keys | @csv),
(.[] | [.[$keys[]]] | @csv)
'
csvkit's in2csv 是低思想的选择:
pip install csvkit
in2csv data.json > output.csv
还有米勒(mlr)在您想要在同一遍中过滤时闪耀:
mlr --json2csv filter '$age > 25' data.json > output.csv
可组合性是重点- curl -s api.example.com/data | jq ... > report.csv 是 cron 一行中完整的 API 到电子表格管道。
方法 5:您可以将 JSON 直接导入 Excel 或 Google 表格吗?
最适合: 非开发商、实时清爽数据、一次性进口。
卓越: Data → 从 Web 获取 Data → 粘贴 API URL,Power Query 为您提供一个可视化编辑器,可在加载之前扩展嵌套记录。真正适合重复刷新同一来源。
谷歌表: 扩展 → Apps Script,然后是一个小获取函数:
function importJSON(url) {
const response = UrlFetchApp.fetch(url);
const data = JSON.parse(response.getContentText());
if (!Array.isArray(data) || data.length === 0) return [["No data"]];
const headers = Object.keys(data[0]);
const rows = data.map(item => headers.map(h => item[h] ?? ""));
return [headers, ...rows];
}
用于单元格中 =importJSON("https://api.example.com/data")。
诚实的取向:对于一次性进口,与转换 在线工具 打开 CSV 比任何一个都快。电子表格本机路线只有在数据按时间表刷新时才能赚取设置成本。
您应该选择哪种方法?
| 方法 | 设置 | 内斯特·JSON | 经常性使用 | 数据保持本地状态 |
|---|---|---|---|---|
| 在线转换器 | 没有 | 自动 | 每次手动 | 是的 - 客户端 |
| JavaScript/json2csv | npm 安装 | 經 flatten |
优秀的 | 是的 |
| Python/熊猫 | 管道安装 | json_normalize |
优秀的 | 是的 |
| jq/csvkit/mlr | 包管理器 | 手动路径 | 优(cron/ci) | 是的 |
| Excel/表 | 帐户/应用程序 | 电源查询UI | 好(自动刷新) | Excel:是的;表:Google 服务器 |
My rule: 触及浏览器工具,直到第三次I'm转换相同形状的数据- 然后它就变成了一个脚本。
哪些边缘情况会破坏 JSON 到 CSV 的转换?
4个陷阱几乎占了每一个破损的出口I've调试:
键不一致。 对象 1 有 email,对象2有 phone、对象3两者兼而有之。仅从第一个对象中获取标头,您就会默默地丢弃数据。修复是遍布所有对象的键并集,缺失值作为空单元格 - 哪些好的工具会自动执行。
未逃脱的特殊角色。 The "史密斯,琼斯&合作伙伴"问题。根据RFC 4180:在双引号中包裹包含逗号,引号或换行符的值,以及将任何嵌入引号加倍("He said ""hello""")。
大文件。 100 MB左右,全文件解析会很痛苦,改为流- jq streams,pandas以块读取,json Lines格式(每行一个对象)使两者都变得更容易,对于多达几十个MB的文件,浏览器工具很好,因为那里's没有上传。
编码。 名称和地址带有非 ASCII 字符。将所有 UTF-8 端到端,并对 Windows 上的 Excel 持怀疑态度,Windows 历史上希望 BOM 正确检测 UTF-8。
还有一种做法是't可选: 在转换之前进行验证。 截断的 JSON 文件在转换过程中会令人困惑地失败,但显然是在转换中失败 json格式化程序。三十秒的验证胜过十分钟的"为什么我的CSV是空的。"
常见问题
如何免费在线将 JSON 转换为 CSV?
将您的 JSON 粘贴到 toolz。dev 上的 JSON 到 CSV 转换器-它会立即生成 CSV,其中嵌套对象被压平并处理逃逸,然后让您复制或下载结果。没有注册,并且处理是 100% 客户端的,因此您的数据永远不会离开您的浏览器。
我可以将嵌套 JSON 转换为 CSV 吗?
是的。嵌套对象被压平为点符号标头(address.city的),而数组要么被连接成一个分隔的字符串,要么被分割成索引列。The Toolz.dev 转换器 自动应用点表示法;在 Python 中, pd.json_normalize() 做同样的事情。
如何在 Python 中将 JSON 文件转换为 CSV?
import pandas as pd; pd.read_json("data.json").to_csv("output.csv", index=False) 对于平坦的 JSON。对于嵌套结构,使用 pd.json_normalize(data) 首先 - 记住自己加入任何数组列,因为标准化叶子列表完好无损。
What's转换非常大的JSON文件的最佳方式?
流而不是负载: jq 命令行上,或者读取分块的熊猫。首先将文件转换为 JSON Lines(每行一个对象)使流式传输变得更加简单。浏览器工具最多可舒适几十 MB;超过 ~100 MB,请使用命令行。
如何将 CSV 转换回 JSON?
的 CSV 到 JSON 转换器 reverses the trip - 每行都变成一个被头行键控的对象, 编程上: pd.read_csv("data.csv").to_json(orient="records")。
为什么我的 CSV 有一些值周围有报价?
That's正确的行为,而不是bug。RFC 4180要求在任何包含逗号,换行符或引号字符的值周围加倍引号,嵌入的引号加倍。电子表格和解析器在读取时将其剥离。
JSON到CSV转换是无损的吗?
对于平坦的 JSON,是的。对于嵌套的 JSON,值仍然存在,但层次结构不然't - 点符号标头是平坦的 代表,而且你能够't总是从它们重建确切的原始嵌套,保持源JSON;将CSV视为派生视图。
为什么我的列在转换后未对齐?
几乎总是逃逸的失败:一个包含逗号的值被引用为 n't,因此解析器从那一点开始会看到额外的列。它's 来自我的 Laravel 导出按钮的确切错误。使用实现 RFC 4180 而不是字符串连接值的转换器 - 如果您编写了自己的值,请使用类似的值进行测试 Smith, Jones & Partners。
如何在 Excel 或 Google Sheets 中将 JSON 转换为 CSV?
两个应用程序都通过帮助程序而不是粘贴导入 JSON。在 Excel 中,使用 Data → 获取数据 → 来自文件 → 来自 JSON,然后在 Power Query 和 Close & Load 中压平查询。在 Google Sheets 中,通过临时应用程序粘贴小数组脚本或使用 JSON 到 CSV 转换器 首先并打开生成的文件 - 通常是一次性的更快路径。
我应该使用哪种 JSON 到 CSV 方法?
对于快速的一次性,客户端转换器速度最快,并且数据私密。对于可重复的管道,请使用 Python 和 pandas;对于庞大的文件,请使用 stream jq 命令行上;只有在非开发人员拥有工作流程时才触及电子表格导入。将工具与您'll重复作业的频率相匹配,而不是与文件's大小单独匹配。
将方法与工作相匹配
JSON-to-CSV看起来像一个解决的单行程序,直到公司名称中的逗号将340行客户数据向右移动一列。该方法的重要性不在于尊重格式:每RFC 4180转义,并结合您的密钥,故意决定您的压平策略,并保留原始的JSON。
对于下一次一次性转换, JSON 到 CSV 转换器 是十五秒路径。首先用。 json格式化程序当数据需要返回时, CSV 到 JSON 转换器 关闭循环 - 这三个循环都在您的浏览器中,它们都从未看到过您的数据服务器端。
相关文章:
- JSON 工具终极指南 (2026)
- 如何在线格式化 JSON:包含示例的完整指南
- 免费在线文本工具指南



