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
相关产品推荐
相关产品推荐

