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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:34:59