JSON数据轻松转换为数据表:实用指南与代码示例
在数据处理与分析中,JSON(JavaScript Object Notation)因其轻量级、易读性和灵活的结构,成为数据交换的主流格式之一,许多数据分析工具(如Excel、SQL数据库、Pandas等)更习惯处理结构化的数据表(二维表,含行列标题),将JSON转换为数据表是数据预处理的关键步骤,本文将详细介绍JSON转换为数据表的常见场景、方法及具体代码示例,帮助您高效完成数据转换。
JSON与数据表的结构差异
在转换前,需先理解两者的核心区别:
-
JSON:是一种树形/嵌套结构,支持对象(键值对集合)、数组(有序值列表)、基本数据类型(字符串、数字、布尔值等)。
[ {"id": 1, "name": "Alice", "hobbies": ["reading", "hiking"], "info": {"age": 25, "city": "Beijing"}}, {"id": 2, "name": "Bob", "hobbies": ["coding"], "info": {"age": 30, "city": "Shanghai"}} ] -
数据表:是二维结构,由行(记录)和列(字段)组成,要求每列数据类型一致,且通常不支持嵌套或数组。
| id | name | hobbies | age | city | |----|-------|----------------|-----|----------| | 1 | Alice | ["reading", "hiking"] | 25 | Beijing | | 2 | Bob | ["coding"] | 30 | Shanghai |
转换的核心目标是将JSON的嵌套/数组结构“扁平化”为数据表的行列结构,同时保留原始数据信息。
常见JSON转换场景与对应方法
根据JSON的复杂程度(简单扁平结构、嵌套对象、嵌套数组),转换方法略有不同,以下是三种典型场景及解决方案:
场景1:简单JSON(扁平结构,无嵌套/数组)
特点:JSON对象是“键值对”集合,值均为基本类型(字符串、数字等),可直接映射为数据表的列。
方法:直接遍历生成表格
- 工具:Python内置
json模块 +pandas(推荐,可直接生成DataFrame) - 步骤:
- 解析JSON字符串为Python对象(列表/字典);
- 若JSON是对象列表,直接传给
pandas.DataFrame(); - 若是单个对象,需包装成列表再转换。
示例代码:
import json
import pandas as pd
# 示例JSON(对象列表)
json_data = '''
[
{"id": 1, "name": "Alice", "age": 25},
{"id": 2, "name": "Bob", "age": 30}
]
'''
# 解析JSON并转为DataFrame
data = json.loads(json_data)
df = pd.DataFrame(data)
# 输出结果
print(df)
输出:
id name age
0 1 Alice 25
1 2 Bob 30
场景2:JSON含嵌套对象(如“info”: {“age”: 25, “city”: “Beijing”})
特点:某些字段的值是对象(字典),需将其拆分为多列列名(如“info.age”“info.city”)。
方法:递归/扁平化处理嵌套对象
- 工具:
pandas.json_normalize()(专门用于扁平化嵌套JSON) - 参数:
record_path(指定数组路径,若JSON是对象列表则默认为第一层)、meta(保留的非嵌套字段)、sep(嵌套列名分隔符,默认为“.”)。
示例代码:
import json
import pandas as pd
# 示例JSON(含嵌套对象)
json_data = '''
[
{"id": 1, "name": "Alice", "info": {"age": 25, "city": "Beijing"}},
{"id": 2, "name": "Bob", "info": {"age": 30, "city": "Shanghai"}}
]
'''
# 解析JSON并扁平化嵌套对象
data = json.loads(json_data)
df = pd.json_normalize(data, sep='_') # 默认将嵌套对象拆分为"key_subkey"列
# 输出结果
print(df)
输出:
id name info_age info_city
0 1 Alice 25 Beijing
1 2 Bob 30 Shanghai
若需自定义列名(如“age”而非“info_age”),可通过meta参数指定:
df = pd.json_normalize(data, meta=['id', 'name'], sep='_') # 输出:id name info_age info_city
场景3:JSON含嵌套数组(如“hobbies”: ["reading", "hiking"])
特点:某些字段的值是数组,需将数组元素展开为多行(“行展开”),或合并为字符串(“列合并”)。
方法1:行展开(数组元素转为多行)
- 工具:
pandas.explode()(将数组列拆分为多行,保持其他列值不变) - 适用场景:需保留每个数组元素作为独立记录(如用户爱好需单独分析)。
示例代码:
import pandas as pd
# 示例JSON(含数组字段)
json_data = '''
[
{"id": 1, "name": "Alice", "hobbies": ["reading", "hiking"]},
{"id": 2, "name": "Bob", "hobbies": ["coding"]}
]
'''
df = pd.DataFrame(json.loads(json_data))
df_exploded = df.explode('hobbies') # 将"hobbies"列数组展开为多行
# 输出结果
print(df_exploded)
输出:
id name hobbies
0 1 Alice reading
0 1 Alice hiking
1 2 Bob coding
方法2:列合并(数组元素转为字符串)
- 工具:
str.join()(将数组元素用指定分隔符合并为字符串) - 适用场景:需将数组作为整体字段存储(如数据库字段不支持数组类型)。
示例代码:
df_merged = df.copy()
df_merged['hobbies'] = df_merged['hobbies'].str.join(', ') # 用逗号+空格连接数组元素
# 输出结果
print(df_merged)
输出:
id name hobbies
0 1 Alice reading, hiking
1 2 Bob coding
场景4:复杂JSON(多层嵌套+数组混合)
特点:同时包含嵌套对象和嵌套数组(如场景2+场景3的组合),需结合json_normalize和explode处理。
示例代码:
import json
import pandas as pd
# 复杂JSON示例(嵌套对象+嵌套数组)
json_data = '''
[
{"id": 1, "name": "Alice", "info": {"age": 25, "city": "Beijing"}, "hobbies": ["reading", "hiking"]},
{"id": 2, "name": "Bob", "info": {"age": 30, "city": "Shanghai"}, "hobbies": ["coding"]}
]
'''
# 第一步:扁平化嵌套对象
df_flat = pd.json_normalize(json.loads(json_data), sep='_')
# 第二步:展开数组列"hobbies"
df_final = df_flat.explode('hobbies')
# 输出结果
print(df_final)
输出:
id name info_age info_city hobbies
0 1 Alice 25 Beijing reading
0 1 Alice 25 Beijing hiking
1 2 Bob 30 Shanghai coding
其他工具实现(非Python场景)
若不使用Python,也可通过以下工具完成JSON转数据表:
Excel(手动处理,适合小型JSON)
- 步骤:
- 复制JSON数据,粘贴到Excel单元格(如A1);
- 选中数据,点击“数据”选项卡 → “获取数据” → “从JSON”;
- 在“Power Query编辑器”中,通过“展开列”功能拆分嵌套对象/数组;
- 关闭并加载,生成数据表。
- 缺点:处理大型JSON或复杂嵌套时效率低。



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