如何在Python中为嵌套JSON自动填充address字段
需求描述
我有如下嵌套结构的JSON对象:
[ { "person": "abc", "city": "united states", "facebooklink": "link", "united states": [ { "person": "cdf", "city": "ohio", "facebooklink": "link", "ohio": [ { "person": "efg", "city": "clevland", "facebooklink": "link", "clevland": [ { "person": "jkl", "city": "Street A", "facebooklink": "link", "Street A": [ { "person": "jkl", "city": "House 1", "facebooklink": "link" } ] } ] }, { "person": "ghi", "city": "columbus", "facebooklink": "link" } ] }, { "person": "abc", "city": "washington", "facebooklink": "link" } ] } ]
需要为每个对象动态添加address字段,字段值为从顶级到当前city的层级路径,以/分隔,最终生成如下JSON:
[ { "person": "abc", "city": "united states", "facebooklink": "link", "address": "united states", "united states": [ { "person": "cdf", "city": "ohio", "facebooklink": "link", "address": "united states/ohio", "ohio": [ { "person": "efg", "city": "clevland", "facebooklink": "link", "address": "united states/ohio/clevland", "clevland": [ { "person": "jkl", "city": "Street A", "facebooklink": "link", "address": "united states/ohio/clevland/Street A", "Street A": [ { "person": "jkl", "city": "House 1", "facebooklink": "link", "address": "united states/ohio/clevland/Street A/House 1" } ] } ] }, { "person": "ghi", "city": "columbus", "facebooklink": "link", "address": "united states/ohio/columbus" } ] }, { "person": "abc", "city": "washington", "facebooklink": "link", "address": "united states/washington" } ] } ]
Python实现方案
可以通过递归函数遍历嵌套结构,为每个节点生成对应的address字段,并处理子节点的路径传递:
import json def add_address(nodes, parent_path=""): for node in nodes: current_city = node["city"] # 生成当前节点的address路径 node["address"] = f"{parent_path}/{current_city}" if parent_path else current_city # 查找当前节点的子节点列表(键名等于当前city的字段) child_key = current_city if child_key in node: # 递归处理子节点,传递当前路径作为父路径 add_address(node[child_key], node["address"]) # 原始JSON数据 original_data = [ { "person": "abc", "city": "united states", "facebooklink": "link", "united states": [ { "person": "cdf", "city": "ohio", "facebooklink": "link", "ohio": [ { "person": "efg", "city": "clevland", "facebooklink": "link", "clevland": [ { "person": "jkl", "city": "Street A", "facebooklink": "link", "Street A": [ { "person": "jkl", "city": "House 1", "facebooklink": "link" } ] } ] }, { "person": "ghi", "city": "columbus", "facebooklink": "link" } ] }, { "person": "abc", "city": "washington", "facebooklink": "link" } ] } ] # 处理数据 add_address(original_data) # 格式化输出处理后的JSON print(json.dumps(original_data, indent=2))
代码说明
- 递归函数
add_address接收节点列表和父路径参数,遍历每个节点:- 从节点中提取
city字段,结合父路径拼接出当前节点的address; - 检查节点中是否存在以当前
city命名的子节点列表,若存在则递归调用函数,传递当前节点的address作为子节点的父路径;
- 从节点中提取
- 处理过程直接修改原始数据结构,若需要保留原数据,可在函数内部创建节点副本进行操作;
- 最终通过
json.dumps格式化输出结果,确保结构清晰。
内容的提问来源于stack exchange,提问作者Tanu
相关产品推荐
相关产品推荐

