Flutter反序列化JSON列表返回null 无法转为自定义ItemModel对象问题
问题产生原因
- 缺少显式类型转换:
jsonDecode解析后的列表元素为dynamic类型,你直接将该类型值传入要求Map<String, dynamic>入参的fromJSON方法,运行时一旦触发类型不匹配就会抛出未捕获的异常,导致方法中断无法正常返回。 - 数值类型转换不兼容:服务端返回的数值字段(
increment、minimum_price)可能为double类型(比如返回值为4500.0而非整数格式的4500),直接赋值给类中声明为int的属性会抛出类型转换异常。 - 反序列化阶段无异常捕获:你仅处理了网络请求的状态码异常,反序列化过程中抛出的所有异常都未被捕获,不仅无法定位具体错误,也会直接导致方法无正确返回值。
解决方法
按照以下步骤修改代码即可修复问题:
- 对每个JSON元素做显式类型转换,确认是
Map<String, dynamic>类型后再传入反序列化方法 - 对数值字段做兼容处理,支持int、double类型自动转换为目标类型
- 增加反序列化阶段的异常捕获逻辑,方便排查问题
修改后的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
相关产品推荐
相关产品推荐

