提取嵌套JSON警告信息时触发TypeError错误求助
错误原因分析
你的代码触发TypeError: string indices must be integers的核心问题是:
- 你错误地将
result["warnings"]当作列表遍历,但实际上它是一个字典,键为terms、teachers、courses、enrollments等字符串。循环时w会变成这些字符串键,此时访问w["enrollments"]相当于用字符串索引另一个字符串,自然触发错误。 - 原代码的遍历层级完全不符合JSON结构,且只处理了
enrollments一类警告,未覆盖需求中的所有类别。
修复后的完整代码实现
以下代码会正确提取terms、enrollments、courses、teachers四类警告信息,并存入对应列表:
import json # 假设你已定义对应警告类(根据实际需求调整) class TermWarnings: def __init__(self, warning_data): self.type = warning_data.get("type") self.message = warning_data.get("message") self.affected_items = warning_data.get("list", []) class EnrollmentWarnings: def __init__(self, warn_type, emplid): self.warning_type = warn_type self.student_emplid = emplid class CourseWarnings: def __init__(self, warning_data): self.type = warning_data.get("type") self.message = warning_data.get("message") self.affected_items = warning_data.get("list", []) class TeacherWarnings: def __init__(self, warning_data): self.type = warning_data.get("type") self.message = warning_data.get("message") self.affected_items = warning_data.get("list", []) # 初始化存储列表 term_warnings = [] enrollment_warnings = [] course_warnings = [] teacher_warnings = [] # 读取并解析JSON文件 with open("sample_result.json", "r") as f: data = json.load(f) # 直接定位到警告字典 warnings_container = data["data"]["attributes"]["result"]["warnings"] # 提取terms类别警告 for warn in warnings_container["terms"]: term_warnings.append(TermWarnings(warn)) # 提取enrollments类别警告 for enroll_warn in warnings_container["enrollments"]: warn_type = enroll_warn["type"] # 遍历每个受影响的学生ID for emplid in enroll_warn["list"]: enrollment_warnings.append(EnrollmentWarnings(warn_type, emplid)) # 提取courses类别警告 for warn in warnings_container["courses"]: course_warnings.append(CourseWarnings(warn)) # 提取teachers类别警告 for warn in warnings_container["teachers"]: teacher_warnings.append(TeacherWarnings(warn))
关键修复说明
- 正确定位数据结构:直接通过键名访问
warnings_container下的四类警告,而非错误遍历字典键。 - 匹配JSON层级:针对
enrollments的结构(列表中每个元素是包含type、message、list的字典),先遍历警告条目,再遍历其中的受影响ID列表。 - 规范文件操作:使用
with语句管理文件流,避免资源泄漏。
内容的提问来源于stack exchange,提问作者SFDonovan
相关产品推荐
相关产品推荐

