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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:24:04