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

英国与挪威气象局JSON响应解析报错及解决方案求助

英国气象局API天气预报解析问题解决

问题背景

之前使用挪威气象局(NMO)API获取逐小时天气预报,用以下代码成功提取时间、气温、湿度到列表:

#for each item in the response add the time, temp and humidity to a list
def parse_json(response):
    timelist = []
    for item in response['properties']['timeseries']:
        utztime = {
            'utztime': item['time'],
            'temperature': item['data']['instant']['details']['air_temperature'],
            'humidity': item['data']['instant']['details']['relative_humidity']
        }
        timelist.append(utztime)
    return timelist

切换到英国气象局API后,响应为FeatureCollection类型,features字段是数组,误将其当作字典访问时触发错误:

TypeError: list indices must be integers or slices, not str

同时英国气象局的timeSeries字段结构与挪威的不同,需要调整解析逻辑。

正确解析代码

针对英国气象局API的FeatureCollection结构,以下是适配的解析代码:

def parse_met_office_json(response):
    timelist = []
    # 遍历features数组中的每个气象Feature对象
    for feature in response['features']:
        # 获取当前Feature下的时间序列数据(不同端点可能字段名略有差异)
        time_series = feature['properties'].get('timeSeries', [])
        for item in time_series:
            # 提取时间、气温、湿度,兼容不同字段命名格式
            utztime = {
                'utztime': item['time'],
                'temperature': item['data'].get('airTemperature') or item['data'].get('air_temperature'),
                'humidity': item['data'].get('relativeHumidity') or item['data'].get('relative_humidity')
            }
            timelist.append(utztime)
    return timelist

关键注意事项

  • 数组遍历:features是数组,必须用循环遍历每个元素,不能直接用response['features']['properties']这种字典访问方式
  • 字段差异:英国气象局不同API端点的字段命名可能不同,比如气温字段可能是airTemperature(驼峰)或air_temperature(下划线),用get()方法可以兼容两种情况
  • 嵌套结构适配:如果是逐半小时预报,部分端点的数据会嵌套在properties.periods下,需要调整遍历路径:
    def parse_met_office_half_hourly(response):
        timelist = []
        for feature in response['features']:
            periods = feature['properties'].get('periods', [])
            for period in periods:
                time_series = period.get('timeSeries', [])
                for item in time_series:
                    utztime = {
                        'utztime': item['time'],
                        'temperature': item['data'].get('airTemperature'),
                        'humidity': item['data'].get('relativeHumidity')
                    }
                    timelist.append(utztime)
        return timelist
    

内容的提问来源于stack exchange,提问作者user24581624

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:23:18