Flutter使用Dio调用API遇FormatException错误求助
解决Flutter Dio调用足球API解析JSON时的FormatException问题
排查方向1:验证API响应的JSON格式合法性
直接打印response.data的原始内容,检查是否存在JSON语法错误:
- 未转义的特殊字符(如引号、换行符)
- 数组/对象末尾的多余逗号
- 未闭合的括号、引号
将响应内容复制到本地JSON校验工具中,确认格式是否完全合规。
排查方向2:调整Dio的响应类型处理逻辑
Dio的响应类型设置会影响解析方式,避免重复解析:
- 如果设置了
responseType: ResponseType.plain,需手动调用json.decode解析字符串:final response = await dio.get(url, options: Options(responseType: ResponseType.plain)); final jsonData = json.decode(response.data); - 如果使用默认的
ResponseType.json,Dio已自动完成解析,直接使用response.data即可,无需再调用json.decode:final response = await dio.get(url); final jsonData = response.data;
排查方向3:修正实体类与JSON结构的匹配问题
若JSON格式合法但解析实体类失败,检查以下几点:
- 实体类字段名与JSON键名完全一致(注意大小写敏感),如果JSON用下划线命名(如
team_name),可通过@JsonKey适配:@JsonSerializable() class Standings { final int rank; @JsonKey(name: "team_name") final String teamName; final int points; Standings({required this.rank, required this.teamName, required this.points}); factory Standings.fromJson(Map<String, dynamic> json) => _$StandingsFromJson(json); Map<String, dynamic> toJson() => _$StandingsToJson(this); } - 字段类型与JSON对应值类型匹配,比如JSON返回数字时,实体类不能用String类型;JSON可能返回null时,实体类字段需设为可空类型。
针对错误日志的针对性处理
如果错误日志提示Unexpected character等信息,说明响应存在非JSON干扰内容:
- 若API返回了HTML错误页面(如500错误),先判断响应状态码,只处理成功状态的响应内容
- 若响应存在BOM头或首尾多余空格,先清理内容再解析:
String cleanContent = response.data.toString().trim(); // 去除UTF-8 BOM头 if (cleanContent.startsWith('\uFEFF')) { cleanContent = cleanContent.substring(1); } final jsonData = json.decode(cleanContent);
内容的提问来源于stack exchange,提问作者Çikapu
相关产品推荐
相关产品推荐

