Python扁平化嵌套JSON如何仅保留带父级前缀的嵌套键
代码修改方案
问题原因
原代码递归处理嵌套字典时,内层子键(比如示例里的Name)会在内层递归的else分支被单独加入fields列表,导致输出了不需要的无父级前缀的子键。
修改后的代码
你可以直接用下面的版本,同时支持自定义拼接符,示例里用下划线_和你给出的输出格式匹配,如果需要点分隔修改拼接符号即可:
def flatten_dict(d, parent_key='', sep='_'): fields = [] items = [] for k, v in d.items(): new_key = f"{parent_key}{sep}{k}" if parent_key else k if isinstance(v, dict): # 递归处理嵌套字典,拿到拼接后的嵌套键 nested_fields, nested_items = flatten_dict(v, new_key, sep=sep) fields.extend(nested_fields) items.extend(nested_items) else: # 仅把完整拼接后的键加入结果列表,不会单独收集内层子键 fields.append(new_key) items.append((new_key, v)) return fields, dict(items) # 调用测试 test_json = {"Field1":"a","Field2":"b","Field3":"c","AdditionalInfo":{"Name":"foo"}} fields, flatten_result = flatten_dict(test_json) print(tuple(fields)) # 输出:('Field1', 'Field2', 'Field3', 'AdditionalInfo_Name')
修改点说明
- 移除了全局变量
fields的使用,改为函数直接返回结果列表,避免全局变量污染 - 新增父级键拼接逻辑,所有加入结果列表的键都是经过父级前缀拼接后的完整键,从根源上避免收集到无前缀的内层子键
- 支持自定义分隔符,修改
sep参数即可切换.、_等不同的拼接格式
内容的提问来源于stack exchange,提问作者user1541301
相关产品推荐
相关产品推荐

