Python调用met.no天气API解析JSON时出现报错如何排查解决
报错根因
两个报错均为代码逻辑写法错误导致,对应触发原因如下:
AttributeError: 'str' object has no attribute 'load':JSON解析方法调用错误。json.load()的入参要求是可读文件/流对象,解析字符串类型的JSON内容需要使用json.loads()(方法名末尾的s是string的缩写)。string indices must be integers:该报错是连锁触发:一是JSON解析方法用错后,json_data并未被转换为字典类型,仍然是字符串,用字符串键(比如"type")索引字符串时,Python要求字符串索引必须是整数,因此抛出该错误;二是代码中多余的.replace("'", '"')逻辑会破坏JSON结构——met.no返回的是标准JSON,本身使用双引号包裹键值,强行替换单引号如果遇到文本内容中自带单引号的场景(比如天气描述里的缩写),会直接导致JSON格式损坏。
修复步骤
- 将
json.load(json_str)替换为json.loads(json_str),使用正确的字符串JSON解析方法。 - 删除多余的
.replace("'", '"')逻辑,保留原生返回的JSON字符串结构即可。 - 避免使用
type作为变量名:type是Python内置函数,占用内置命名空间可能引发其他隐性问题,替换为其他自定义变量名即可。
修复后可运行代码
import json from urllib.request import Request, urlopen # 读取天气预报接口数据 url = "https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=59.911491&lon=10.757933" req = Request(url) req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Python/3.10.5') content: bytes = urlopen(req).read() # 转换为JSON对象 json_str: str = content.decode('utf8') json_data = json.loads(json_str) # 读取并打印字段 forecast_type = json_data["type"] print(forecast_type)
运行效果
代码正常执行后会输出接口返回的顶级type字段值Feature,不会再触发上述两个报错。
内容的提问来源于stack exchange,提问作者Europa
相关产品推荐
相关产品推荐

