返回 网站动态
DevTool Team
更新于 3月23日

JSON 转 CSV 在线转换指南:Python 示例、嵌套 JSON 与批量处理

学习如何把 JSON 在线转换为 CSV,涵盖 Python 代码示例、嵌套 JSON 展平、批量转换和 Excel、Google Sheets 导入场景。

什么是JSON,为什么要转换为CSV?

JSON(JavaScript对象表示法) 是一种轻量级、人类可读的数据格式,广泛用于Web服务和应用程序之间的数据交换。它支持复杂的嵌套结构,包括对象、数组和多种数据类型。

CSV(逗号分隔值) 是一种简单的表格格式,每一行代表一行数据,值之间用分隔符(通常是逗号)分隔。它被电子表格应用、数据库和数据分析工具普遍支持。

为什么要将JSON转换为CSV?

在许多场景中,将JSON转换为CSV是必不可少的:

  1. 在Excel/Google Sheets中进行数据分析 - 电子表格应用无法直接导入复杂的JSON
  2. 数据库导入 - 许多数据库接受CSV进行批量数据加载
  3. 数据可视化 - Tableau、Power BI等工具通常需要表格格式
  4. 业务报告 - 非技术人员更喜欢电子表格友好的格式
  5. 旧系统集成 - 旧系统可能只支持CSV导入
  6. 文件大小减小 - CSV文件通常比等效的JSON小20-40%

常见使用场景

场景 为什么CSV更好
API响应处理 将API数据转换为电子表格分析
日志文件分析 扁平化结构化日志以便于过滤
导出用户数据 提供用户友好格式的可下载数据
数据迁移 在不同系统之间传输数据
报告生成 为业务用户创建自动化报告
机器学习 准备ML训练数据集(许多库更喜欢CSV)

理解JSON结构类型

在转换之前,了解您的JSON结构很重要:

简单扁平JSON(最容易转换)

[
  {
    "name": "张三",
    "email": "zhangsan@example.com",
    "age": 28
  },
  {
    "name": "李四",
    "email": "lisi@example.com",
    "age": 34
  }
]

CSV输出:

name,email,age
张三,zhangsan@example.com,28
李四,lisi@example.com,34

嵌套对象(需要扁平化)

[
  {
    "name": "张三",
    "address": {
      "city": "北京",
      "zip": "100001"
    }
  }
]

CSV输出(扁平化):

name,address.city,address.zip
张三,北京,100001

嵌套数组(复杂)

[
  {
    "name": "张三",
    "skills": ["Python", "JavaScript", "SQL"]
  }
]

CSV输出选项:

选项1:数组作为字符串

name,skills
张三,"Python, JavaScript, SQL"

选项2:展开为多行

name,skill
张三,Python
张三,JavaScript
张三,SQL

将JSON转换为CSV:Python指南

Python是数据转换中最流行的语言。这里是一个综合指南:

方法1:使用Pandas(推荐用于复杂JSON)

import pandas as pd
import json

# 加载JSON数据
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

# 转换为DataFrame
df = pd.DataFrame(data)

# 处理嵌套对象(扁平化)
df_flattened = pd.json_normalize(data)

# 保存为CSV
df_flattened.to_csv('output.csv', index=False, encoding='utf-8')

print("✅ 转换完成!已保存到 output.csv")

高级:处理嵌套数组

import pandas as pd

# 包含嵌套数组的示例数据
data = [
    {
        "name": "张三",
        "skills": ["Python", "SQL"],
        "experience": {"years": 5, "company": "科技公司"}
    }
]

# 扁平化嵌套结构
df = pd.json_normalize(
    data,
    sep='_',  # 对嵌套键使用下划线
    max_level=2  # 控制扁平化深度
)

# 对于数组:展开为多行
df_exploded = df.explode('skills')

df_exploded.to_csv('output.csv', index=False)

方法2:使用内置CSV模块(无依赖)

import json
import csv

# 加载JSON
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

# 从第一个对象提取标题
headers = data[0].keys()

# 写入CSV
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=headers)
    writer.writeheader()
    writer.writerows(data)

print("✅ CSV文件创建成功!")

方法3:处理复杂嵌套JSON

import json
import csv

def flatten_json(nested_json, parent_key='', sep='.'):
    """
    递归扁平化嵌套JSON对象
    """
    items = []
    for k, v in nested_json.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k

        if isinstance(v, dict):
            items.extend(flatten_json(v, new_key, sep=sep).items())
        elif isinstance(v, list):
            # 将列表转换为逗号分隔的字符串
            items.append((new_key, ', '.join(map(str, v))))
        else:
            items.append((new_key, v))

    return dict(items)

# 加载嵌套JSON
with open('nested_data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

# 扁平化所有对象
flattened_data = [flatten_json(item) for item in data]

# 获取所有唯一键(某些对象可能有不同的结构)
all_keys = set()
for item in flattened_data:
    all_keys.update(item.keys())

# 写入CSV
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=sorted(all_keys))
    writer.writeheader()
    writer.writerows(flattened_data)

print("✅ 嵌套JSON已扁平化为CSV!")

不想写代码? 使用我们的免费JSON转CSV转换器 - 它自动处理所有这些场景,零编码要求。只需粘贴您的JSON并立即下载CSV!

将JSON转换为CSV:JavaScript/Node.js指南

用于前端应用或Node.js环境:

浏览器(客户端)

// 示例JSON数据
const jsonData = [
  { name: '张三', email: 'zhangsan@example.com', age: 28 },
  { name: '李四', email: 'lisi@example.com', age: 34 }
];

function convertToCSV(jsonArray) {
  if (!jsonArray || jsonArray.length === 0) return '';

  // 提取标题
  const headers = Object.keys(jsonArray[0]);

  // 创建标题行
  const headerRow = headers.join(',');

  // 创建数据行
  const dataRows = jsonArray.map(obj => {
    return headers.map(header => {
      const value = obj[header];
      // 转义引号并在包含逗号时用引号包裹
      const escaped = String(value).replace(/"/g, '""');
      return escaped.includes(',') ? `"${escaped}"` : escaped;
    }).join(',');
  });

  return [headerRow, ...dataRows].join('\n');
}

// 转换并下载
const csv = convertToCSV(jsonData);
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'data.csv';
link.click();

console.log('✅ CSV已下载!');

Node.js(使用json2csv库)

const { parse } = require('json2csv');
const fs = require('fs');

// 示例数据
const data = [
  {
    name: '张三',
    email: 'zhangsan@example.com',
    address: { city: '北京', zip: '100001' }
  }
];

// 配置选项
const opts = {
  fields: ['name', 'email', 'address.city', 'address.zip'],
  flatten: true,  // 自动扁平化嵌套对象
  header: true
};

try {
  const csv = parse(data, opts);
  fs.writeFileSync('output.csv', csv, 'utf-8');
  console.log('✅ CSV文件创建成功!');
} catch (err) {
  console.error('❌ 将JSON转换为CSV时出错:', err);
}

JSON转CSV转换的最佳实践

1. 处理数据类型一致性

# 确保数据类型一致
df['age'] = pd.to_numeric(df['age'], errors='coerce')  # 转换为数字
df['date'] = pd.to_datetime(df['date'], errors='coerce')  # 解析日期

2. 处理缺失值

# 填充缺失值
df.fillna('N/A', inplace=True)  # 将NaN替换为'N/A'

# 或删除包含缺失值的行
df.dropna(inplace=True)

3. 转义特殊字符

CSV需要正确转义:

  • 逗号 - 用引号包裹字段:"北京, 朝阳区"
  • 引号 - 双引号:"她说 ""你好"""
  • 换行符 - 用引号包裹:"第1行\n第2行"
# Pandas自动处理这个
df.to_csv('output.csv', index=False, quoting=csv.QUOTE_NONNUMERIC)

4. 选择正确的分隔符

对于包含逗号的数据,考虑替代分隔符:

# 使用分号(在欧洲常见)
df.to_csv('output.csv', sep=';', index=False)

# 使用制表符
df.to_csv('output.tsv', sep='\t', index=False)

# 使用竖线
df.to_csv('output.csv', sep='|', index=False)

5. 高效处理大文件

# 分块处理大文件
chunk_size = 10000
for chunk in pd.read_json('large_file.json', lines=True, chunksize=chunk_size):
    chunk.to_csv('output.csv', mode='a', header=False, index=False)

6. 保留Unicode字符

# 始终指定UTF-8编码
df.to_csv('output.csv', encoding='utf-8-sig', index=False)  # 带BOM的UTF-8用于Excel

高级场景

将API响应转换为CSV

import requests
import pandas as pd

# 从API获取数据
response = requests.get('https://api.example.com/users')
data = response.json()

# 转换为CSV
df = pd.DataFrame(data['results'])  # 大多数API会包装数据
df.to_csv('api_export.csv', index=False)

喜欢无代码解决方案? 我们的JSON转CSV转换器可以直接处理API响应 - 只需粘贴JSON并立即转换!

批量转换多个JSON文件

import glob
import pandas as pd

# 查找所有JSON文件
json_files = glob.glob('data/*.json')

# 合并所有到一个CSV
combined_df = pd.DataFrame()

for file in json_files:
    df = pd.read_json(file)
    combined_df = pd.concat([combined_df, df], ignore_index=True)

combined_df.to_csv('combined_output.csv', index=False)
print(f"✅ 已合并{len(json_files)}个文件到combined_output.csv")

保留复杂数据结构

对于深度嵌套的JSON,考虑保留一些结构:

import json
import pandas as pd

# 加载复杂JSON
with open('complex.json') as f:
    data = json.load(f)

# 部分扁平化:将数组保留为JSON字符串
df = pd.json_normalize(data, max_level=1)

# 将剩余的嵌套结构转换为JSON字符串
for col in df.columns:
    if df[col].apply(lambda x: isinstance(x, (dict, list))).any():
        df[col] = df[col].apply(json.dumps)

df.to_csv('output.csv', index=False)

常见问题和解决方案

问题1:JSON结构不一致

问题: 对象有不同的键

[
  {"name": "张三", "age": 28, "city": "北京"},
  {"name": "李四", "email": "lisi@example.com"}
]

解决方案: 使用json_normalize处理缺失键

df = pd.json_normalize(data)
# 缺失值自动填充为NaN

问题2:Excel不能正确显示CSV

问题: 特殊字符显示为乱码

解决方案: 使用带BOM的UTF-8编码

df.to_csv('output.csv', encoding='utf-8-sig', index=False)

问题3:非常大的JSON数组

问题: 巨大文件导致内存错误

解决方案: 流式处理

import ijson  # 安装: pip install ijson

with open('huge.json', 'rb') as f:
    objects = ijson.items(f, 'item')

    # 批量处理
    batch = []
    for obj in objects:
        batch.append(obj)
        if len(batch) >= 1000:
            pd.DataFrame(batch).to_csv('output.csv', mode='a', header=False)
            batch = []

问题4:日期/时间格式问题

问题: 日期未被电子表格应用识别

解决方案: 标准化日期格式

df['date'] = pd.to_datetime(df['date']).dt.strftime('%Y-%m-%d')

工具对比:在线 vs 编程

方面 在线转换器 Python脚本 Node.js脚本
设置 无(基于浏览器) 需要Python + 库 需要Node.js + npm
最适合 快速一次性转换 大型/复杂文件,自动化 前端集成
文件大小限制 ~500MB(浏览器内存) 受磁盘空间限制 受内存限制
隐私 100%本地(我们的工具) 100%本地 100%本地
速度 小文件快 大文件最快 中等文件快
自定义 UI选项 完全控制 完全控制
学习曲线 基础Python知识 JavaScript知识
批量处理 手动 易于自动化 易于自动化

试用我们的免费JSON转CSV转换器

需要在不编写任何代码的情况下将JSON转换为CSV吗?使用我们的**免费在线JSON转CSV转换器** - 专为重视隐私和效率的开发者和数据专业人员打造。

为什么选择我们的转换器?

100%基于浏览器 - 所有处理都在本地进行,您的数据永不离开设备 ✅ 隐私优先 - 无跟踪、无Cookie,符合GDPR/CCPA ✅ 处理复杂JSON - 自动扁平化嵌套对象和数组 ✅ 可自定义选项 - 选择分隔符、编码和格式 ✅ 无需注册 - 完全免费,无限次转换 ✅ 多语言支持 - 提供简体中文、繁體中文和English ✅ 深色模式 - 深夜调试时护眼 ✅ 快速可靠 - 针对性能优化,即时预览

功能包括:

  • 拖放文件上传
  • 实时验证和错误检测
  • 下载前预览
  • 自定义分隔符配置(逗号、分号、制表符、竖线)
  • 多种编码选项(UTF-8、UTF-16、ASCII)
  • 一键复制到剪贴板
  • 批量文件处理(即将推出)
  • 转换历史(即将推出)

立即转换JSON到CSV →

常见问题

可以直接将JSON转换为Excel吗?

虽然我们的工具转换为CSV(Excel可以打开),您也可以使用Python的openpyxlxlsxwriter库创建原生Excel文件:

df.to_excel('output.xlsx', index=False, engine='openpyxl')

然而,CSV通常更受欢迎,因为它更简单、更快且具有普遍兼容性。

如何处理根级别的JSON数组?

如果您的JSON是对象数组[{...}, {...}],大多数转换器会自动处理。如果是单个对象{...},请将其包装在数组中或在Python中使用pd.json_normalize()

JSON Lines和常规JSON有什么区别?

JSON Lines(JSONL/NDJSON)每行有一个JSON对象:

{"name": "张三", "age": 28}
{"name": "李四", "age": 34}

转换使用:

df = pd.read_json('data.jsonl', lines=True)

可以自动化JSON到CSV的转换吗?

可以!使用带有cron作业(Linux/Mac)或任务计划程序(Windows)的Python脚本:

# Cron作业:每天凌晨2点运行
0 2 * * * python /path/to/convert_script.py

总结

将JSON转换为CSV是开发者、数据分析师和任何使用现代API和数据系统的人的基本技能。无论您选择:

  • 使用我们的免费在线转换器 进行快速、隐私优先的转换
  • 编写Python脚本 用于自动化数据管道
  • 实现JavaScript解决方案 用于前端应用

关键是理解您的数据结构并为任务选择正确的工具。

对于大多数用户,我们的**JSON转CSV转换器** 提供了简单性和强大功能的完美平衡 - 无需安装,完全私密,永久免费。

立即开始转换,体验将JSON数据转换为电子表格就绪的CSV格式的最快方式!


有更多问题?查看我们的综合FAQ或浏览我们收藏中的更多开发者工具