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

Dio发起POST请求报错:'_InternalLinkedHashMap<String, dynamic>'不是String子类型

问题出现原因

Dio默认开启了自动响应解析逻辑,当服务端返回的响应头Content-Type为application/json时,Dio会自动将返回的JSON字符串解析为Map<String, dynamic>类型的对象,直接赋值给response.data。
而jsonDecode方法要求入参必须是原始JSON字符串,你把已经解析完成的Map对象传入jsonDecode,就会触发类型不匹配的报错。

解决方案

方案1:直接使用已解析的响应数据(推荐)

直接删除jsonDecode调用,直接使用response.data即可,代码修改如下:

class AuthenticationApi {
  final dio = Dio(BaseOptions(baseUrl: FlavorApi.getBaseUrl()));

  Future<dynamic> login(
      {required String email, required String password}) async {
    try {
      FormData formData = FormData.fromMap(
          {'email': email, 'password': password, 'ip': '127.0.0.1'});
      final response = await dio.post(
          '/login?oauth_consumer_key=${FlavorApi.getConsumerKey()}&oauth_consumer_secret=${FlavorApi.getConsumerSecret()}',
          data: formData);
      // 直接使用response.data,已经是解析完成的Map
      var responseData = response.data; 
      print('Data = $responseData');
    } on DioError catch (e) {
      print(e.message);
    }
  }
}

方案2:手动控制解析逻辑

如果你需要拿到原始JSON字符串自行解析,可以在请求配置中指定responseType为ResponseType.plain,此时response.data就是字符串类型,再调用jsonDecode就不会报错,修改代码如下:

final response = await dio.post(
    '/login?oauth_consumer_key=${FlavorApi.getConsumerKey()}&oauth_consumer_secret=${FlavorApi.getConsumerSecret()}',
    data: formData,
    // 指定返回原始字符串
    options: Options(responseType: ResponseType.plain),
);
var responseData = jsonDecode(response.data);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:15:03