调用geocoder.freegeoip获取IP地理位置时报JSONDecodeError如何解决
报错原因说明
- 触发的
JSONDecodeError: Expecting value: line 1 column 1 (char 0)本质很简单:程序试图把根本不是JSON格式的内容(大概率是空响应、4xx错误的HTML页面)硬解析成JSON结构,这时候就会抛出该异常。 - 出现该问题的直接诱因是调用
geocoder.freegeoip()的时候传了空字符串当入参:库会把这个空值当成你要查询的目标IP,拼接到请求地址里,最后发出去的请求完全不符合接口规范,服务端自然不会返回正常的JSON定位数据,解析环节就直接报错。 - 这里的逻辑误区是:你本来想靠空值让程序自动获取用户IP,结果传空串根本不会触发自动获取的逻辑,反而因为非法请求拿到了无效响应。
对应解决方法
- 调整调用逻辑:要自动获取当前网络出口的公网IP定位,根本不需要给
geocoder.freegeoip()传任何参数,直接无参调用就行,定位接口会自动识别请求来源的IP,返回对应位置数据。 - 取值不需要手动解析整个JSON结构,返回的geocoder对象自带现成的属性可以直接读取:
- 读
g.ip就能拿到解析好的用户公网IP,直接给后续流程使用 - 读
g.latlng就能拿到格式为[纬度, 经度]的坐标值
- 读
- 如果无参调用后还是出现同样的JSON解析错误,说明请求定位接口的时候碰到了网络不通、接口限流拦截的问题,拿到的是带错误信息的非JSON内容;可以先打印返回对象的
status属性确认请求状态,排查网络连通性之后重试即可。
正确调用示例
import geocoder # 无参调用,自动识别当前出口IP的定位信息 g = geocoder.freegeoip() # 直接取需要的字段就行,不用自己解析json user_public_ip = g.ip user_lat, user_lon = g.latlng
内容的提问来源于stack exchange,提问作者Tieron
相关产品推荐
相关产品推荐

