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

