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

如何用Python解析多层嵌套JSON提取rules节点id列表并修复报错

报错原因

原代码逻辑存在两处错误:

  • 直接遍历json.load()返回的顶层字典时,循环变量拿到的是字典的字符串类型键名(如"$schema"、"version"、"runs"),对字符串值使用["tool"]这种键索引,必然触发TypeError: string indices must be integers。
  • 未匹配JSON实际嵌套结构:目标rules节点的访问路径为顶层字典 -> runs数组 -> 数组内单个run对象 -> tool对象 -> driver对象 -> rules数组,原代码的取值路径完全不匹配结构。

注意:你贴出的示例JSON在runs数组第一个元素的闭合花括号后多了一个冗余逗号,实际文件如果保留这个语法错误,json.load()会直接抛出解析异常,需要先删除该逗号保证JSON格式合法。

实现代码
import json

# 替换为你的JSON文件实际存储路径
json_file_path = "target.sarif"

with open(json_file_path, "r", encoding="utf-8") as f:
    sarif_data = json.load(f)

rule_id_list = []
# 兼容SARIF规范中runs数组可能存在多个条目的情况
for run in sarif_data.get("runs", []):
    # 逐层安全取值,避免字段缺失触发KeyError
    driver_info = run.get("tool", {}).get("driver", {})
    rule_list = driver_info.get("rules", [])
    # 提取每条规则的id
    for rule in rule_list:
        if rule.get("id"):
            rule_id_list.append(rule["id"])

print(rule_id_list)
运行结果

执行代码后将输出你预期的列表结构:

["MISRA C++:2008 18-0-1", "MISRA C++:2008 3-9-2", "MISRA C++:2008 0-1-2", "MISRA C++:2008 5-0-13", "MISRA C++:2008 5-2-4", "MISRA C++:2008 7-1-1", "MISRA C++:2008 15-5-3", "MISRA C++:2008 15-3-2"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:09:20