如何将JSON文件改为CSV文件:实用指南与操作步骤
在数据处理与分析中,JSON(JavaScript Object Notation)和CSV(Comma-Separated Values)是两种常见的数据格式,JSON以灵活的键值对结构存储数据,适合复杂嵌套场景;而CSV以表格形式存储,兼容Excel、数据库等工具,便于统计分析,将JSON转为CSV,能显著提升数据的可用性和处理效率,本文将详细介绍转换的原理、方法及注意事项,助你轻松完成格式转换。
理解JSON与CSV的核心差异
在转换前,需先明确两种格式的特点:
- JSON:支持嵌套结构(如对象中包含数组、数组中嵌套对象),键值对存储,数据类型丰富(字符串、数字、布尔值等),适合描述复杂关系。
[ {"id": 1, "name": "张三", "hobbies": ["阅读", "游泳"], "info": {"age": 25, "city": "北京"}}, {"id": 2, "name": "李四", "hobbies": ["游戏", "篮球"], "info": {"age": 30, "city": "上海"}} ] - CSV:扁平化表格结构,每行一条记录,列之间用逗号(或其他分隔符)分隔,仅支持基本数据类型,适合简单表格数据。
id,name,hobbies,age,city 1,张三,"[""阅读"", ""游泳""]",25,北京 2,李四,"[""游戏"", ""篮球""]",30,上海
核心挑战:JSON的嵌套和数组结构需被“展平”为CSV的列,避免数据丢失或结构混乱。
转换前的准备工作:明确数据结构
转换前需分析JSON的层级关系,确定以下关键点:
- 主数据层级:JSON中存储核心记录的数组(如上述示例的
[]),每条数组元素对应CSV的一行。 - 嵌套字段处理:若存在嵌套对象(如
info),需选择“保留为字符串”或“拆分为列”(如info.age转为age列)。 - 数组字段处理:若存在数组(如
hobbies),需选择“合并为字符串”(如"阅读,游泳")或“拆分为多行”(每项爱好占一行)。
示例场景:
- 简单JSON(无嵌套/数组):直接按键转为列。
- 嵌套JSON:通过点号()或下划线(
_)连接字段名(如info.age→info_age)。 - 数组JSON:优先合并为字符串(避免行数爆炸),若需保留每项数据,则需先“展开数组”。
常用转换方法:从手动到自动化
方法1:手动转换(适合小型JSON,数据量<100行)
适用场景:JSON结构简单,无需重复操作。
步骤:
- 解析JSON:用文本编辑器(如VS Code、Sublime)打开JSON文件,确认数据结构。
- 提取表头:从第一条记录中提取所有键(如
id、name、hobbies、info.age、info.city),作为CSV的列名。 - 填充数据:按行提取值,处理嵌套/数组字段:
- 嵌套对象:手动展开(如
{"age":25,"city":"北京"}→25,北京)。 - 数组:手动合并为逗号分隔的字符串(如
["阅读","游泳"]→"阅读,游泳")。
- 嵌套对象:手动展开(如
- 保存为CSV:将表头和数据粘贴到Excel或文本编辑器,另存为
.csv文件(注意选择UTF-8编码,避免中文乱码)。
缺点:效率低,易出错,仅适合极小数据量。
方法2:编程自动化(适合中大型JSON,需批量处理)
编程是高效处理JSON转CSV的主流方式,支持复杂嵌套和自动化流程,以下是Python的实现方法(Python内置json库,无需额外安装)。
示例1:简单JSON(无嵌套/数组)
假设JSON文件data.json内容为:
[
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 30}
]
Python代码:
import json
# 读取JSON文件
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f) # 解析为Python列表
# 提取表头(假设所有记录键相同)
headers = list(data[0].keys())
# 写入CSV文件
with open('data.csv', 'w', encoding='utf-8', newline='') as f:
# 写入表头
f.write(','.join(headers) + '\n')
# 写入数据
for item in data:
row = [str(item[key]) for key in headers] # 值转为字符串
f.write(','.join(row) + '\n')
print("转换完成!")
输出CSV:
id,name,age 1,张三,25 2,李四,30
示例2:处理嵌套和数组(复杂JSON)
针对前文嵌套JSON示例,需“展平”字段,使用pandas库(数据处理利器)可简化操作:
安装pandas:pip install pandas
Python代码:
import json
import pandas as pd
# 读取JSON文件
with open('nested_data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 转换为DataFrame(pandas自动展平简单嵌套)
df = pd.json_normalize(data, sep='_') # sep指定嵌套字段连接符(如info_age)
# 处理数组字段:hobbies合并为字符串
df['hobbies'] = df['hobbies'].apply(lambda x: ','.join(x) if isinstance(x, list) else x)
# 保存为CSV(无索引,utf-8编码)
df.to_csv('nested_data.csv', index=False, encoding='utf-8')
print("转换完成!")
输出CSV:
id,name,hobbies,info_age,info_city 1,张三,阅读,游泳,25,北京 2,李四,游戏,篮球,30,上海
说明:
pd.json_normalize()是pandas提供的“展平”函数,能自动处理一层嵌套(如info→info_age)。- 若需处理多层嵌套(如
info.address.street),可使用record_path和meta参数(详见pandas文档)。 - 数组字段通过
apply+join合并为字符串,避免拆分行。
方法3:在线工具转换(适合非技术人员,小型数据)
若不熟悉编程,可使用在线JSON转CSV工具,如:
- ConvertCSV(https://www.convertcsv.com/json-to-csv.htm):上传JSON文件,自动生成预览,下载CSV。
- JSON to CSV Converter(https://json-csv.com):支持拖拽上传,可自定义分隔符和编码。
优点:无需安装,操作简单。
缺点:数据隐私风险(敏感数据慎用),文件大小受限(lt;10MB)。
方法4:命令行工具(适合批量处理,开发环境)
使用jq(JSON处理工具)+csvkit(CSV工具集)实现命令行转换:
- 安装工具:
- macOS:
brew install jq csvkit - Ubuntu:
sudo apt-get install jq csvkit
- macOS:
- 转换命令:
# 提取JSON并转为CSV(假设JSON数组每行一条记录) jq -r '.[] | [.id, .name, .info.age] | @csv' data.json > data.csv
说明:
jq -r:输出原始字符串(不转义)。.[]:遍历JSON数组。[.id, .name, .info.age]:选择字段,@csv自动用逗号和引号包裹。
转换中的常见问题与解决
中文乱码
原因:CSV文件编码与读取工具不匹配(如Excel默认GBK)。
解决:
- 保存CSV时指定
encoding='utf-8-sig'(Python中`utf-8-sig



还没有评论,来说两句吧...