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

Python API数据提取问题:无法获取sensorPointId以拉取传感器读数

解决提取sensorPointId时的"对象不可下标访问"问题

核心排查方向

你遇到的报错本质是试图对非字典/列表类型的变量使用下标([]),常见原因有两个:

  1. API返回的响应没转成Python可操作的字典/列表,直接操作了字符串或Response对象
  2. 数据层级搞错,比如资产列表是数组,但你直接对整个数组取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:25:20