📜  展平 json python (1)

📅  最后修改于: 2023-12-03 15:39:21.770000             🧑  作者: Mango

展平 JSON 数据结构

在处理 JSON 数据时,有时候我们需要将多层嵌套的 JSON 整理成一个平面的结构,以便在后续的处理过程中更方便地进行分析和操作。例如,我们可能需要将一个包含多个子文档的 JSON 对象转换为一系列单独的文档,以便进行批量操作。

在 Python 中,我们可以使用递归函数来实现这个功能。也可以使用第三方库 flattentool 等。

1. 使用递归函数展平 JSON

下面我们通过一个例子来演示如何使用递归函数将一个嵌套的 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] 来去掉最后一个下划线,以便更好地进行格式化输出。

2. 使用 flattentool 库展平 JSON

除了手动编写递归函数外,我们也可以使用第三方库 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 一致,并且不能包含在键名中。在默认的情况下,分隔符为下划线 _,前缀为空字符串。如果需要修改这些设置,可以传入相应的关键字参数。