You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中WeatherModel解析JSON时Temp与minTemp返回null问题排查

问题排查:Flutter WeatherModel中temp/minTemp为null,但date正常获取

问题现象

执行Flutter代码时,WeatherModel的temp和minTemp字段返回null,但date字段能正常获取到值。

代码实现

class WeatherModel {
  final String? date;
  final double? temp;
  final double? maxTemp;
  final double? minTemp;
  final String? weatherStateName;
  WeatherModel(
      {required this.date,
      required this.temp,
      required this.maxTemp,
      required this.minTemp,
      required this.weatherStateName});
  factory WeatherModel.fromJson(dynamic data) {
    var jsonData = data['forecast']?['forecastday']?[0]?['day'];
    print('$jsonData');
    return WeatherModel(
        date: data['location']?['localtime'],
        temp: jsonData?['avgtemp_c'],
        maxTemp: jsonData?['maxtemp_c'],
        minTemp: jsonData?['mintemp_c'],
        weatherStateName: jsonData?['condition']?['text']);
  }
  @override
  String toString() {
    return 'tem = $temp minTemp = $minTemp date = $date';
  }
}

执行日志

I/flutter ( 5213): tem = null minTemp = null date = 2022-08-25 20:26

排查原因

核心问题出在API返回数据的解析路径或字段名不匹配:

  • 代码中通过data['forecast']?['forecastday']?[0]?['day']获取天气详情,但如果接口返回的forecast下的数组键名不是forecastday(比如拼写错误、命名格式不同),会导致jsonData为null,后续的avgtemp_c等字段自然也为null。
  • 若jsonData打印有内容但字段为null,可能是avgtemp_c/mintemp_c等字段名和接口实际返回的不一致(比如接口用下划线命名avg_temp_c)。
  • 另外,接口返回的温度可能是整数类型,直接赋值给double?类型可能存在隐式转换失败的情况。

解决方案

1. 确认API数据结构

先打印完整的API返回数据,明确字段层级和命名:

factory WeatherModel.fromJson(dynamic data) {
  // 打印完整数据,确认路径正确性
  print('Full API Response: $data');
  var jsonData = data['forecast']?['forecastday']?[0]?['day'];
  print('Day Data: $jsonData');
  // ... 后续代码
}

根据打印结果修正forecast到day的解析路径,确保键名完全匹配。

2. 修正字段解析与类型转换

针对字段名匹配和类型转换问题,调整代码:

factory WeatherModel.fromJson(dynamic data) {
  var jsonData = data['forecast']?['forecastday']?[0]?['day'];
  
  return WeatherModel(
    date: data['location']?['localtime'],
    // 显式处理类型转换,兼容整数/浮点返回值
    temp: jsonData?['avgtemp_c'] is num ? (jsonData?['avgtemp_c'] as num).toDouble() : null,
    maxTemp: jsonData?['maxtemp_c'] is num ? (jsonData?['maxtemp_c'] as num).toDouble() : null,
    minTemp: jsonData?['mintemp_c'] is num ? (jsonData?['mintemp_c'] as num).toDouble() : null,
    weatherStateName: jsonData?['condition']?['text'],
  );
}

3. 兜底处理(可选)

如果API存在字段缺失情况,可以给参数添加默认值,避免构造函数报错:

WeatherModel({
  required this.date,
  required this.temp,
  required this.maxTemp,
  required this.minTemp,
  required this.weatherStateName,
}) : temp = temp ?? 0.0,
     maxTemp = maxTemp ?? 0.0,
     minTemp = minTemp ?? 0.0;

内容的提问来源于stack exchange,提问作者basbos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 01:45:41