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

Flutter执行jsonDecode解析接口数据报FormatException错误解决方案

问题根因

这个报错和网关返回的JSON格式无关,核心是重复解码+把Dart对象的打印格式错当成了接口原始响应:

  • Dio默认配置下responseType为ResponseType.json,收到响应后会自动对合法JSON做一次jsonDecode,此时response.data的运行时类型是List<Map<String, dynamic>>(从你打印的结构看是数组格式响应),本身就是已经解析完成的结构化Dart对象,不是原始JSON字符串。
  • 你看到的[{Id: 0, SourceId: 0, ServiceId: 11...}]是Dart中List/Map对象的默认字符串输出格式,这类输出的键名不会带双引号,本身就不符合JSON语法,你把这个字符串传入jsonDecode必然触发格式异常。
  • Postman能看到合法JSON是因为Postman展示的是接口返回的原始响应字符串,和你代码里拿到的经过Dio预处理后的对象不是一个东西。
排查&修复方案
  • 删掉多余的重复解码逻辑
    不需要写jsonDecode(response.data.toString()),直接使用response.data做后续实体转换即可,参考代码:
    // 移除错误的转码逻辑
    // final rawData = jsonDecode(response.data.toString());
    
    // 直接使用Dio预解析好的结构化数据
    final List<dynamic> rawList = response.data;
    // 配合自动生成的实体类完成转换
    final result = rawList
        .map((item) => YourAutoGenEntity.fromJson(item as Map<String, dynamic>))
        .toList();
    
  • 特殊场景适配
    如果你需要手动拿到原始响应字符串自行处理,发起请求时把响应类型改成纯文本即可:
    final resp = await dio.post(
      '/your/gateway/api/path',
      data: requestParams,
      options: Options(
        responseType: ResponseType.plain, // 不做自动JSON解析,直接返回原始字符串
      ),
    );
    // 此时response.data是原始JSON字符串,可正常解码
    final parsedData = jsonDecode(resp.data);
    
  • 调试注意事项
    不要通过print(response.data)的输出判断接口返回的JSON格式是否合法,Dart对象的打印结果不代表原始响应结构。要查看真实原始响应,可以开启Dio的LogInterceptor查看完整的请求响应原始报文,避免误判问题。

额外提醒:如果你的网关接口返回的JSON键名是大驼峰格式(比如Id/SourceId),不需要手动做字段名转义,在实体类的@JsonSerializable注解里配置fieldRename: FieldRename.none或者显式声明@JsonKey(name: 'Id')即可正常映射。

内容的提问来源于stack exchange,提问作者SaDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:18:17