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

Flutter反序列化JSON列表返回null 无法转为自定义ItemModel对象问题

问题产生原因
  • 缺少显式类型转换:jsonDecode 解析后的列表元素为 dynamic 类型,你直接将该类型值传入要求 Map<String, dynamic> 入参的 fromJSON 方法,运行时一旦触发类型不匹配就会抛出未捕获的异常,导致方法中断无法正常返回。
  • 数值类型转换不兼容:服务端返回的数值字段(increment、minimum_price)可能为 double 类型(比如返回值为 4500.0 而非整数格式的 4500),直接赋值给类中声明为 int 的属性会抛出类型转换异常。
  • 反序列化阶段无异常捕获:你仅处理了网络请求的状态码异常,反序列化过程中抛出的所有异常都未被捕获,不仅无法定位具体错误,也会直接导致方法无正确返回值。
解决方法

按照以下步骤修改代码即可修复问题:

  1. 对每个JSON元素做显式类型转换,确认是Map<String, dynamic>类型后再传入反序列化方法
  2. 对数值字段做兼容处理,支持int、double类型自动转换为目标类型
  3. 增加反序列化阶段的异常捕获逻辑,方便排查问题

修改后的ItemModel反序列化方法

factory ItemModel.fromJSON(Map<String,dynamic> jsonMap){
  return ItemModel(
    id: jsonMap['item_id'] as String?,
    itemName: jsonMap['item_name'] as String?,
    increment: (jsonMap['increment'] as num?)?.toInt(),
    minPrice: (jsonMap['minimum_price'] as num?)?.toInt(),
    user: jsonMap['user'] as String?,
    category: jsonMap['category'] as String?,
    closingDate: jsonMap['closing_date'] as String?,
    closingTime: jsonMap['closing_hour'] as String?,
    image: jsonMap['image'] as String?
  );
}

修改后的网络请求方法

Future<List<ItemModel>?> fetchCategories(String category) async {
  try {
    final response = await http.get(Uri.http(base_url, '$path/$category'));
    if (response.statusCode == 200) {
      final items = jsonDecode(response.body) as List;
      print(items);
      List<ItemModel> itemsList = items.map((e) {
        // 显式转换为Map类型
        final json = e as Map<String, dynamic>;
        return ItemModel.fromJSON(json);
      }).toList();
      return itemsList;
    } else {
      throw Exception("Could not fetch courses");
    }
  } catch (e) {
    // 可在这里打印异常信息定位问题
    print('反序列化/请求异常:$e');
    rethrow;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:06:05