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

使用Dio请求遇类型错误:期望Map<String,dynamic>却获String,求解决

解决Dio请求返回String而非Map导致的类型错误

你遇到的错误核心原因是:response.data是字符串类型,但City.fromJson方法期望接收Map<String, dynamic>类型的参数。这通常是Dio未自动将接口返回的JSON字符串解析为Map对象导致的,常见诱因是接口返回的Content-Type响应头不是application/json,或者Dio默认配置未触发自动解析。

方法1:手动解析JSON字符串

使用dart:convert的jsonDecode工具,将字符串手动转换为Map:

首先导入依赖包:

import 'dart:convert';

修改请求代码:

Future<List<MALL>> get() async {
  final dio = Dio();
  var url = 'My URL';
  Response response = await dio.get(url);
  // 把字符串解析为Map类型
  Map<String, dynamic> jsonData = jsonDecode(response.data);
  City api = City.fromJson(jsonData);
  return api.malls;
}

方法2:强制Dio返回JSON格式

在请求时指定responseType为ResponseType.json,让Dio强制将响应解析为JSON对象,不受接口Content-Type影响:

Future<List<MALL>> get() async {
  final dio = Dio();
  var url = 'My URL';
  // 配置响应类型为JSON
  Response response = await dio.get(
    url,
    options: Options(responseType: ResponseType.json)
  );
  City api = City.fromJson(response.data);
  return api.malls;
}

额外优化:提升建模类的安全性

你的MALL类使用late final字段,若接口返回字段缺失或类型不匹配,会触发运行时错误。建议改为带默认值的非空类型,增强鲁棒性:

class MALL {
  final int id;
  final String name;
  final String images;

  MALL({required this.id, required this.name, required this.images});

  factory MALL.fromJson(Map<String, dynamic> data) {
    // 添加类型检查与默认值,避免空值或类型错误
    final id = data['id'] as int? ?? 0;
    final name = data['name'] as String? ?? '';
    final images = data['images'] as String? ?? '';
    return MALL(id: id, name: name, images: images);
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:09:27