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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:42:43