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
相关产品推荐
相关产品推荐

