📅  最后修改于: 2023-12-03 15:39:21.770000             🧑  作者: Mango
在处理 JSON 数据时,有时候我们需要将多层嵌套的 JSON 整理成一个平面的结构,以便在后续的处理过程中更方便地进行分析和操作。例如,我们可能需要将一个包含多个子文档的 JSON 对象转换为一系列单独的文档,以便进行批量操作。
在 Python 中,我们可以使用递归函数来实现这个功能。也可以使用第三方库 flattentool 等。
下面我们通过一个例子来演示如何使用递归函数将一个嵌套的 JSON 结构展平。
import json
def flatten_json(data, prefix=''):
if isinstance(data, dict):
for key, value in data.items():
flatten_json(value, prefix + key + '_')
elif isinstance(data, list):
for i, item in enumerate(data):
flatten_json(item, prefix + str(i) + '_')
else:
print(prefix[:-1], data)
# 测试数据
data = {
'a': {
'b': {
'c': 1,
'd': 2
},
'e': [
{'f': 3},
{'g': 4}
]
}
}
# 输出结果
'''
a_b_c 1
a_b_d 2
a_e_0_f 3
a_e_1_g 4
'''
flatten_json(data)
在这个例子中,我们定义了一个名为 flatten_json
的递归函数,该函数接受一个 JSON 数据 data
和一个前缀 prefix
,将 JSON 结构展平成一系列由键和值组成的二元组。
我们首先判断传入的数据是否为字典类型。如果是,对其进行递归访问,同时将当前键的名称添加到前缀中,这样就可以保证不同子级的键名不重复。如果数据是列表类型,我们则需要将前缀以序号的形式进行标记。
最后,我们检查是否到达了最终的值,如果是,则输出该值及其对应的键名。注意,这里我们使用了 prefix[:-1]
来去掉最后一个下划线,以便更好地进行格式化输出。
除了手动编写递归函数外,我们也可以使用第三方库 flattentool 来实现 JSON 展平。这个库可以通过 pip 安装:
pip install flattentool
下面是使用 flattentool 的一个例子:
import json
from flattentool import flatten, unflatten
# 测试数据
data = {
'a': {
'b': {
'c': 1,
'd': 2
},
'e': [
{'f': 3},
{'g': 4}
]
}
}
# 将 JSON 展平
flat_data = flatten(data)
# 输出结果
'''
{
"a_b_c": 1,
"a_b_d": 2,
"a_e_0_f": 3,
"a_e_1_g": 4
}
'''
print(json.dumps(flat_data, indent=4))
# 将展平后的 JSON 反转为原始结构
reverted_data = unflatten(flat_data)
# 输出结果
'''
{
"a": {
"b": {
"c": 1,
"d": 2
},
"e": [
{"f": 3},
{"g": 4}
]
}
}
'''
print(json.dumps(reverted_data, indent=4))
在这个例子中,我们首先使用 flatten
函数将传入的 JSON 数据展平成一个包含键和值的字典。然后,我们又使用 unflatten
函数将展平后的字典反转为原始的 JSON 数据结构。
需要注意的是,在使用 flattentool 时,我们需要保证键名之间的分隔符 separator
和前缀 prefix
一致,并且不能包含在键名中。在默认的情况下,分隔符为下划线 _
,前缀为空字符串。如果需要修改这些设置,可以传入相应的关键字参数。