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

Android:动态访问所有嵌套JSON对象的技术方案问询

我明白你遇到的麻烦了——这种无限嵌套、每个对象名称都唯一的JSON结构,用常规的静态解析方式根本没法应对。别担心,咱用递归的思路就能完美解决你的两个需求,下面给你详细的实现方案:

需求1:传入任意对象名称,返回该对象的所有键值对

核心思路是递归遍历整个JSON结构,不管嵌套有多深,只要找到匹配的对象名称,就返回它的完整内容。下面用Python实现这个逻辑:

def find_object_by_name(json_data, target_name):
    # 遍历当前层级的所有键值对
    for key, value in json_data.items():
        # 找到目标对象名,直接返回对应内容
        if key == target_name:
            return value
        # 如果当前值是嵌套字典,递归进去继续找
        elif isinstance(value, dict):
            result = find_object_by_name(value, target_name)
            if result is not None:
                return result
    # 遍历完所有层级没找到,返回None
    return None

# 你的测试JSON数据
test_json = {
  "address": {
    "state": "World",
    "address": "infinite space, 000",
    "city": "Android city",
    "address2": {
      "state": "World2",
      "address": "infinite space2, 002",
      "city": "Android city2",
      "address3": {
        "state": "World3",
        "address": "infinite space3, 003",
        "city": "Android city3"
      }
    }
  },
  "valid": {
    "state": "World",
    "address": "infinite space, 000",
    "city": "Android city",
    "valid2": {
      "state": "World2",
      "address": "infinite space2, 002",
      "city": "Android city2",
      "valid3": {
        "state": "World3",
        "address": "infinite space3, 003",
        "city": "Android city3"
      }
    }
  }
}

# 测试调用:查找address2
print(find_object_by_name(test_json, "address2"))

运行后会直接返回address2对应的完整嵌套对象,不管它藏在多少层下面都能精准定位。

需求2:将所有嵌套对象分离并单独存储

这个需求同样用递归实现,我们可以把每个嵌套对象都提取出来,存到一个字典里,方便后续单独使用。这里提供两种版本:

版本1:保留对象的完整嵌套结构

def extract_all_objects(json_data, result_dict=None):
    if result_dict is None:
        result_dict = {}
    for key, value in json_data.items():
        if isinstance(value, dict):
            # 把当前嵌套对象存入结果字典
            result_dict[key] = value
            # 递归处理对象内部的嵌套结构
            extract_all_objects(value, result_dict)
    return result_dict

# 测试调用
all_objects = extract_all_objects(test_json)
# 打印所有提取的对象
for name, obj in all_objects.items():
    print(f"对象名称: {name}")
    print(f"对象内容: {obj}\n")

运行后你会得到包含address、address2、address3、valid、valid2、valid3的字典,每个键对应完整的对象内容。

版本2:只保留对象的基础键值对(排除嵌套子对象)

如果你的需求是让每个分离的对象只包含自身的基础数据,不携带子对象,可以用这个版本:

def extract_all_objects_flat(json_data, result_dict=None):
    if result_dict is None:
        result_dict = {}
    for key, value in json_data.items():
        if isinstance(value, dict):
            # 只保留当前对象的非嵌套键值对
            flat_obj = {k: v for k, v in value.items() if not isinstance(v, dict)}
            result_dict[key] = flat_obj
            # 递归处理子对象
            extract_all_objects_flat(value, result_dict)
    return result_dict

# 测试调用
flat_objects = extract_all_objects_flat(test_json)
for name, obj in flat_objects.items():
    print(f"对象名称: {name}")
    print(f"平面对象内容: {obj}\n")

比如address会只返回{"state": "World", "address": "infinite space, 000", "city": "Android city"},完全和子对象分离。

这两种方案都是基于递归实现的,不管未来新增多少层嵌套,只要对象名唯一,就能正常工作,完美适配你的动态解析需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:19:30