Flutter中jsonDecode解析Dio.post返回数据失败求助
解决Dio.post响应json.decode解析失败的问题
可能原因及处理方案
响应数据含隐藏字符:看似合法的JSON字符串可能开头有BOM(字节顺序标记)、空格或不可见控制字符,导致解析报错。可以先打印原始字节码排查:
// 输出响应数据的字节编码,查看是否有异常字符 print(response.data.codeUnits);确认后清理字符串再解析:
String cleanedData = response.data.trim().replaceAll(RegExp(r'^\W+|\W+$'), ''); Map<String, dynamic> result = json.decode(cleanedData);Dio已自动解析响应:Dio默认会把
Content-Type为application/json的响应自动解析成Map/List,此时response.data本身就是Map类型,再用json.decode会把Map当成字符串处理,必然报错。先确认类型:// 打印response.data的实际类型 print(response.data.runtimeType);如果输出是
_InternalLinkedHashMap<String, dynamic>,直接强转即可:Map<String, dynamic> result = response.data as Map<String, dynamic>;响应内容类型不匹配:若响应头
Content-Type不是application/json,Dio不会自动解析,但返回的字符串可能有额外包装(如前缀、后缀)。可以强制指定响应类型为字符串后处理:Response response = await dio.post( yourUrl, options: Options(responseType: ResponseType.plain), // 强制返回原始字符串 ); // 清理后解析 Map<String, dynamic> result = json.decode(response.data.trim());测试用例类型错误:测试时如果直接把
{"test":"good"}赋值给response.data,要确保它是字符串类型而非已解析的Map:// 错误:直接传入Map var testData = {"test":"good"}; // 正确:传入字符串格式的JSON var testData = '{"test":"good"}';
核心验证步骤
- 先确认
response.data的实际运行类型,避免重复解析操作。 - 若为字符串,优先清理首尾不可见字符后再尝试解析。
- 核对响应头的
Content-Type是否与返回内容格式匹配。
内容的提问来源于stack exchange,提问作者Mohammed Seif Aldin
相关产品推荐
相关产品推荐

