Python API数据提取问题:无法获取sensorPointId以拉取传感器读数
解决提取sensorPointId时的"对象不可下标访问"问题
核心排查方向
你遇到的报错本质是试图对非字典/列表类型的变量使用下标([]),常见原因有两个:
- API返回的响应没转成Python可操作的字典/列表,直接操作了字符串或Response对象
- 数据层级搞错,比如资产列表是数组,但你直接对整个数组取
sensorPoints字段
完整可运行示例代码
假设你的资产API返回结构是类似这样的数组(单个资产为字典,包含sensorPoints列表):
# 示例API返回解析后的数据结构 [ { "assetId": "asset_001", "sensorPoints": [ {"sensorPointId": "sp_101", "type": "temperature"}, {"sensorPointId": "sp_102", "type": "humidity"} # 更多传感器点... ] }, # 其他资产... ]
对应处理代码:
import requests # 1. 获取并解析资产API响应 asset_api_url = "你的资产列表API地址" response = requests.get(asset_api_url) # 关键:把JSON字符串转成Python可操作的列表/字典 assets = response.json() # 2. 定位目标资产 target_asset_id = "你要查询的assetId" target_asset = None for asset in assets: # 用get避免键不存在报错 if asset.get("assetId") == target_asset_id: target_asset = asset break if not target_asset: print(f"找不到assetId为{target_asset_id}的资产") else: # 3. 提取所有sensorPointId sensor_points = target_asset.get("sensorPoints") # 先确认sensorPoints是列表类型 if isinstance(sensor_points, list): # 列表推导式提取ID,同时过滤空值 sensor_point_ids = [sp.get("sensorPointId") for sp in sensor_points if sp.get("sensorPointId")] # 4. 批量调用传感器读数API reading_api_url = "你的传感器读数API地址" all_readings = [] for sp_id in sensor_point_ids: # 构造请求URL,根据实际API参数调整 reading_response = requests.get(f"{reading_api_url}?sensorPointId={sp_id}") reading_data = reading_response.json() all_readings.append(reading_data) # 这里可以添加对读数的后续处理逻辑 print(f"成功获取{len(all_readings)}个传感器的读数") else: print("注意:该资产的sensorPoints不是列表类型,无法提取ID")
报错排查步骤
如果还是报错,按以下步骤逐一验证:
- 打印
type(assets):如果输出是<class 'str'>,说明API返回的不是合法JSON,或者你没调用.json()解析响应 - 打印
type(target_asset):如果是None,说明没匹配到目标assetId;如果不是<class 'dict'>,说明资产数据结构不符合预期 - 打印
type(target_asset.get("sensorPoints")):必须是<class 'list'>才能遍历,否则要检查API返回的字段名是否正确(比如是不是sensor_points而非sensorPoints)
实用小技巧
用.get(key)代替直接[key],可以避免因字段不存在直接崩溃,还能设置默认值,比如target_asset.get("sensorPoints", []),即使该字段不存在也会返回空列表,保证后续逻辑正常运行。
内容的提问来源于stack exchange,提问作者Jennifer
相关产品推荐
相关产品推荐

