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

如何在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接收节点列表和父路径参数,遍历每个节点:
    1. 从节点中提取city字段,结合父路径拼接出当前节点的address;
    2. 检查节点中是否存在以当前city命名的子节点列表,若存在则递归调用函数,传递当前节点的address作为子节点的父路径;
  • 处理过程直接修改原始数据结构,若需要保留原数据,可在函数内部创建节点副本进行操作;
  • 最终通过json.dumps格式化输出结果,确保结构清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:18:24