API返回JSON数据提取geocode字段报错,求解决方案及疑问解答
搞定你的API数据提取问题!
嘿,作为刚接触API的新手,踩这些结构访问的坑太正常啦,我帮你一步步理清楚:
一、先解决那个恼人的报错:list indices must be integers, not str
你的代码里对JSON结构的访问逻辑完全搞反了,咱们拆解下问题:
- 首先,
data['features']是个列表,得先通过索引(比如[0])拿出列表里的单个元素,不能直接用['id']去访问列表哦 - 每个feature里的
properties是个字典,不是列表,所以根本不需要加[0] geocode是properties里的子字典,同样不是列表,也不用加[0]- 还有个关键:
response.json()已经帮你把响应转成Python能直接用的字典/列表了,再用json.loads()纯纯是多此一举,这就是你疑问里的冗余操作!
修正后的可用代码:
import requests response = requests.get("https://api.weather.gov/alerts/active") data = response.json() # 提取第一条预警的geocode数据 first_geocode = data['features'][0]['properties']['geocode'] print(first_geocode) # 如果要把所有预警的geocode都捞出来,用循环就行 all_geocodes = [] for feature in data['features']: geocode = feature['properties']['geocode'] all_geocodes.append(geocode)
二、关于“JSON转换是否冗余”的疑问
绝对冗余!requests的response.json()方法已经自动把接口返回的JSON字符串解析成Python原生的字典、列表了,直接用就行。你要是再套个json.loads(),反而会报错,因为它只认字符串输入,不认已经解析好的Python对象。
三、给新手的小技巧:搞不清结构就打印类型
以后再遇到这种结构搞混的情况,直接打印每一层的类型就能理清:
print(type(data['features'])) # 会输出 <class 'list'>,说明这是列表,得先取索引 print(type(data['features'][0]['properties'])) # 输出 <class 'dict'>,说明是字典,用键直接访问
内容的提问来源于stack exchange,提问作者klex52s
相关产品推荐
相关产品推荐

