英国与挪威气象局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
相关产品推荐
相关产品推荐

