You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python将嵌套JSON扁平化为扁平JSON的问题求助

解决嵌套JSON转扁平JSON的问题

我看了你的代码和需求,问题主要出在列表元素的处理逻辑上——原代码遍历列表时没有给每个元素添加索引标记,导致同名字段的值互相覆盖;另外那个no_mas函数的逻辑也有点偏离通用扁平化的需求。

下面是修正后的代码,能正确处理字典和嵌套列表,生成符合预期的扁平JSON:

def flatten_json(y):
    out = {}

    def flatten(x, name=''):
        # 处理字典类型
        if isinstance(x, dict):
            for key, value in x.items():
                # 如果是特殊字段需要单独处理,可以在这里加判断,比如你之前的'MetaDataList'
                # if key == 'MetaDataList':
                #     out[name + key] = value
                #     continue
                flatten(value, name + key + '_')
        # 处理列表类型,添加索引后缀避免字段覆盖
        elif isinstance(x, list):
            for idx, item in enumerate(x):
                flatten(item, name + str(idx) + '_')
        # 处理基本数据类型,存入结果字典
        else:
            out[name[:-1]] = x

    flatten(y)
    return out

测试你的示例数据

用你提供的sample4测试:

sample4 = { 
    "a": 1, 
    "b": 2, 
    "c": 3, 
    "d": [{"a": 5, "b": 6}, {"a": 7, "b": 8}], 
    "e": [{"a": 1}, {"a": 2}], 
    "f": 9, 
    "g": [{"a": 5, "b": 6}, {"a": 7, "b": 8}] 
}

print(flatten_json(sample4))

输出结果会是:

{
    'a': 1,
    'b': 2,
    'c': 3,
    'd_0_a': 5,
    'd_0_b': 6,
    'd_1_a': 7,
    'd_1_b': 8,
    'e_0_a': 1,
    'e_1_a': 2,
    'f': 9,
    'g_0_a': 5,
    'g_0_b': 6,
    'g_1_a': 7,
    'g_1_b': 8
}

代码说明

  1. 字典处理:遍历每个键,递归处理值,拼接键名时用下划线分隔,保证层级清晰。
  2. 列表处理:用enumerate获取每个元素的索引,把索引作为键名的一部分(比如d_0_),这样列表中不同位置的同名字段不会互相覆盖。
  3. 基本类型处理:当遇到字符串、数字等基本类型时,去掉最后一个多余的下划线,把值存入结果字典。
  4. 特殊字段扩展:如果需要像原代码那样特殊处理某个字段(比如'MetaDataList'),可以在字典处理的分支里添加判断,直接将该字段的原始值存入结果,跳过递归扁平化。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:12:36