在Flutter中解析Firebase Realtime Database返回的JSON报错如何解决?
问题原因
- 第一类报错核心原因:未对Firebase返回的原始JSON字符串做解码操作。你直接将String类型的
data.value当做Map/List传入解析方法,类型不匹配触发'String' is not a subtype of type 'Map<String, dynamic>'报错。 - 第二类JSON异常核心原因:实体类字段类型和实际JSON字段类型不匹配。你的HomeSlider类中shopId定义为String类型,但返回的JSON里shopId是int类型的1、2,json_annotation解析时类型校验不通过抛出异常。
- 额外问题:你写的两段解析代码本身存在语法错误、逻辑错误:第一种方法里addAll的参数写法不符合Dart语法;第二种方法错误把根节点为数组的JSON结构当做Map遍历。
解决步骤
步骤1:修复实体类字段类型
将shopId字段的类型调整为和JSON返回一致的int类型,如果业务需要String类型也可以通过JsonKey注解做转换,修改后的实体类代码如下:
import 'package:json_annotation/json_annotation.dart'; part 'HomeSlider.g.dart'; @JsonSerializable() class HomeSlider{ HomeSlider(this.image, this.shopId); String image=""; // 调整为int类型和JSON返回匹配 int shopId=0; factory HomeSlider.fromJson(Map<String, dynamic> json) => _$HomeSliderFromJson(json); Map<String, dynamic> toJson() => _$HomeSliderToJson(this); }
修改完成后执行命令重新生成解析代码:flutter pub run build_runner build --delete-conflicting-outputs
如果确实需要shopId为String类型,可以使用JsonKey做自动转换:
// 定义转换方法 String intToString(dynamic num) => num.toString(); @JsonSerializable() class HomeSlider{ HomeSlider(this.image, this.shopId); String image=""; // 加注解做类型转换 @JsonKey(fromJson: intToString) String shopId=""; // 其余代码不变 }
步骤2:先解码JSON再做解析
使用dart:convert库的jsonDecode方法先把原始字符串解码为Dart集合类型,再遍历解析,正确代码如下:
import 'dart:convert'; // 先解码原始JSON字符串 List<dynamic> decodedData = jsonDecode(data.value); // 遍历解析为HomeSlider对象 List<HomeSlider> imgList = decodedData.map((item) => HomeSlider.fromJson(item)).toList();
内容的提问来源于stack exchange,提问作者Miriana Itani
相关产品推荐
相关产品推荐

