Python解析JSON提取房间数据报错,求代码修复与遍历指导
错误原因分析
你出错的那行代码roomCategory = ['InformationRoomsBlock'][i]['roomCategory']逻辑完全错误:['InformationRoomsBlock']是一个只包含字符串的字面量列表,用整数索引i访问后得到的是字符串'InformationRoomsBlock',再用['roomCategory']去索引字符串自然会报"list indices must be integers or slices, not str"——本质是你没有从JSON数据的对应层级中获取InformationRoomsBlock对象,而是自己写了一个字符串列表。
正确遍历逻辑与修复代码
首先明确你的JSON结构层级:
顶层对象 └── objects (数组) └── 每个对象 └── xsdData (对象) └── InformationRooms (数组) └── 每个房间元素 └── InformationRoomsBlock (对象) ├── numberRooms (数值) ├── numberSeats (数值) └── roomCategory (字符串)
推荐用字典来按roomCategory分类存储数据(比单独定义变量更灵活,适配任意多的分类),修复后的代码示例:
import json # 初始化存储结构:key是roomCategory,value是包含总房间数和总座位数的字典 room_stats = {} # 读取并解析JSON文件 with open('your_file.json', 'r', encoding='utf-8') as f: data = json.load(f) # 逐层遍历JSON结构 for obj in data['objects']: # 检查xsdData和InformationRooms是否存在,避免KeyError if 'xsdData' not in obj or 'InformationRooms' not in obj['xsdData']: continue for room_item in obj['xsdData']['InformationRooms']: # 检查InformationRoomsBlock是否存在 if 'InformationRoomsBlock' not in room_item: continue room_block = room_item['InformationRoomsBlock'] # 提取所需字段 category = room_block.get('roomCategory') rooms = room_block.get('numberRooms', 0) # 设默认值避免字段缺失报错 seats = room_block.get('numberSeats', 0) # 按分类统计 if category not in room_stats: room_stats[category] = {'total_rooms': 0, 'total_seats': 0} room_stats[category]['total_rooms'] += rooms room_stats[category]['total_seats'] += seats # 输出结果 for category, stats in room_stats.items(): print(f"分类 {category}: 总房间数 {stats['total_rooms']}, 总座位数 {stats['total_seats']}")
关键注意事项
- 逐层访问,避免跳过层级:必须从顶层
data['objects']开始,一层一层往下取嵌套的字段,不能直接写字面量列表去索引 - 添加存在性检查:处理大JSON文件时,部分数据可能存在字段缺失的情况,用
in或者get()方法可以避免运行时报错 - 用字典替代单独变量:如果
roomCategory的可能值很多,单独定义变量会非常繁琐,用字典动态存储更高效
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

