使用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 }
代码说明
- 字典处理:遍历每个键,递归处理值,拼接键名时用下划线分隔,保证层级清晰。
- 列表处理:用
enumerate获取每个元素的索引,把索引作为键名的一部分(比如d_0_),这样列表中不同位置的同名字段不会互相覆盖。 - 基本类型处理:当遇到字符串、数字等基本类型时,去掉最后一个多余的下划线,把值存入结果字典。
- 特殊字段扩展:如果需要像原代码那样特殊处理某个字段(比如'MetaDataList'),可以在字典处理的分支里添加判断,直接将该字段的原始值存入结果,跳过递归扁平化。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

