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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:59:10