如何从任意JSON生成含父属性值重复的扁平值列表
实现任意嵌套JSON的全路径值扁平化输出
核心逻辑
用递归遍历JSON的每个节点,维护一个前缀列表记录当前节点的所有父级值。遇到原子值(字符串、数字、布尔、null)时,将前缀列表与当前值拼接后输出一行;遇到对象或数组时,继续递归遍历其内部元素,确保所有嵌套层级的原子值都能被提取并带上完整的父级值前缀。
Python 实现代码
def flatten_json_values(data, prefix=None): if prefix is None: prefix = [] # 处理原子值:字符串、数字、布尔、null if isinstance(data, (str, int, float, bool)) or data is None: print(' '.join(map(str, prefix + [data]))) return # 处理数组:遍历每个元素,沿用当前前缀递归 elif isinstance(data, list): for item in data: flatten_json_values(item, prefix.copy()) # 处理对象:遍历所有属性值,沿用当前前缀递归(忽略键) elif isinstance(data, dict): for value in data.values(): flatten_json_values(value, prefix.copy())
使用示例
假设输入JSON文件input.json内容如下:
{ "department": "engineering", "employees": [ { "name": "Alice", "role": "developer", "is_fulltime": true, "phone": null }, { "name": "Bob", "role": "designer", "is_fulltime": false, "phone": "555-1234" } ] }
调用代码提取值:
import json # 加载JSON数据 with open('input.json', 'r') as f: json_data = json.load(f) # 执行扁平化输出 flatten_json_values(json_data)
输出结果:
engineering engineering Alice engineering developer engineering True engineering None engineering Bob engineering designer engineering False engineering 555-1234
自定义调整
如果需要数组元素之间传递前缀(比如数组["a", "b", {"c": "d"}]要输出a、a b、a b d),只需修改数组处理逻辑:
elif isinstance(data, list): current_prefix = prefix.copy() for item in data: if isinstance(item, (str, int, float, bool)) or item is None: # 原子值直接输出并加入前缀 print(' '.join(map(str, current_prefix + [item]))) current_prefix.append(item) else: # 嵌套结构沿用当前前缀递归 flatten_json_values(item, current_prefix.copy())
特性说明
- 支持任意深度的嵌套JSON结构
- 保留
null值输出(Python中显示为None,如需输出null可替换str(data)为"null" if data is None else str(data)) - 完全不输出键,仅处理值的嵌套关系
- 递归逻辑通用,适配所有合法JSON类型
内容的提问来源于stack exchange,提问作者Denio Mariz
相关产品推荐
相关产品推荐

