如何用Python解析包含多个对象的JSON文件?
用Python解析嵌套JSON并统计子节点类型
当然可以搞定!你的需求核心是递归遍历嵌套的JSON结构,自动统计每个object类型节点下的param和子object数量——哪怕你不知道这些节点的具体名称(像obj1、obj4这类)也完全没问题。
实现思路
因为你的JSON是多层嵌套的,递归函数是最适合的方案:
- 遍历每个节点的所有子元素,跳过当前节点自身的
type和permission属性(这些是节点的元信息,不是我们要统计的子节点) - 如果子元素是
param类型,直接计数 - 如果子元素是
object类型,先计数,再递归统计它下面的子节点数量
完整代码示例
import json # 你的JSON数据(已整理为合法格式) json_data = ''' { "obj1": { "type": "object", "permission": "r", "obj2": { "type": "param", "permission": "r/w" }, "obj3": { "type": "param", "permission": "r" }, "obj4": { "type": "object", "permission": "r", "obj5": { "type": "param", "permission": "r/w" }, "obj6": { "type": "param", "permission": "r" }, "obj7": { "type": "object", "permission": "r", "obj8": { "type": "param", "permission": "r/w" }, "obj9": { "type": "param", "permission": "r" } } } } } ''' def count_child_types(node): """递归统计当前节点下的直接param数量和子object数量""" param_count = 0 object_count = 0 # 遍历当前节点的所有子元素 for key, value in node.items(): # 跳过节点自身的元属性 if key in ("type", "permission"): continue # 根据子元素类型计数 if value["type"] == "param": param_count += 1 elif value["type"] == "object": object_count += 1 return param_count, object_count # 解析JSON数据 data = json.loads(json_data) # 遍历所有节点并输出统计结果 def traverse_nodes(node, parent_key=None): for key, value in node.items(): if key in ("type", "permission"): continue # 只处理object类型的节点(param没有子节点需要统计) if value["type"] == "object": params, objs = count_child_types(value) print(f"{key}: 包含{params}个param和{objs}个object") # 递归遍历子object节点 traverse_nodes(value, key) # 先处理顶层节点 top_node_name = next(iter(data.keys())) top_params, top_objs = count_child_types(data[top_node_name]) print(f"{top_node_name}: 包含{top_params}个param和{top_objs}个object") traverse_nodes(data[top_node_name])
运行结果
obj1: 包含2个param和1个object obj4: 包含2个param和1个object obj7: 包含2个param和0个object
这和你期望的结果完全匹配(你描述里的obj2应该是笔误,实际对应JSON里的obj4)。
灵活调整说明
如果需要统计所有后代节点(比如obj1的所有param和object,包括obj4、obj7下面的),只需要修改count_child_types函数,把递归得到的子节点数量合并到当前节点:
def count_child_types(node): param_count = 0 object_count = 0 for key, value in node.items(): if key in ("type", "permission"): continue if value["type"] == "param": param_count += 1 elif value["type"] == "object": object_count += 1 # 合并子object的统计结果 child_params, child_objs = count_child_types(value) param_count += child_params object_count += child_objs return param_count, object_count
这样运行后,obj1的统计结果会变成包含6个param和2个object,根据你的实际需求选择即可。
内容的提问来源于stack exchange,提问作者Nesrine_Kh
相关产品推荐
相关产品推荐

