Flutter天气应用调用OpenWeatherAPI报400及JSON解析问题求助
Flutter天气应用JSON解析及请求错误解决方案
核心错误排查
你控制台返回的{"cod":"400","message":"Nothing to geocode"}是OpenWeatherMap接口直接返回的错误,含义是请求时传入的城市参数为空,这是触发后续异常的直接原因:
- 先在
getWeather方法入口添加打印print('传入的城市参数为:$name'),验证是否上层调用时没有正确取到搜索框输入的内容就发起了请求 - 临时把请求参数里的
q写死为固定城市名比如'shanghai'测试,如果能返回200状态码的正常数据,直接修改UI层的搜索框取值逻辑,确保点击下一步时确实把输入内容传给了getWeather方法
Model类解析逻辑修复
即使接口返回正常数据,你当前的Model类也会触发解析异常,需要做以下修改:
- 修复字段类型不匹配问题:
WeatherAppDetails类中的message字段不要定义为double类型,接口异常时返回的message是字符串格式,改为dynamic类型避免类型转换报错 - 补全
fromJson方法的字段赋值:你当前的WeatherAppDetails.fromJson里完全没有处理city字段,要补全赋值逻辑 - 删除不必要的非空断言:
City.fromJson里coord赋值末尾的!要删掉,避免接口返回空值时直接抛出空异常
修改后的WeatherAppDetails.fromJson参考代码:
WeatherAppDetails.fromJson(Map<String, dynamic> json) { cod = json['cod']; message = json['message'] is num ? (json['message'] as num).toDouble() : 0; cnt = json['cnt']; city = json['city'] != null ? City.fromJson(json['city']) : null; if (json['list'] != null) { list = <ListDetails>[]; json['list'].forEach((v) { list!.add(ListDetails.fromJson(v)); }); } }
补充错误捕获逻辑
调用getWeather的位置要套try catch处理异常,避免请求失败直接崩溃:
try { var data = await DataService().getWeather(inputCityName); print('解析成功,城市名称:${data.city?.name}'); } catch (e) { print('请求/解析失败:$e'); // 可在此处添加用户提示,比如"城市不存在,请重新输入" }
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

