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

Flutter Dio解析JSON时报List<dynamic>非Map<String,dynamic>?子类型怎么解决

报错原因

该报错的核心是代码期望解析Map<String, dynamic>类型的JSON对象,但接口实际返回的是List<dynamic>数组类型,类型不匹配导致抛出异常。

修复步骤
  • 第一步:先打印接口返回的完整数据,确认实际结构
    你可以在dio请求完成后先打印返回值,验证是否和你预期的JSON结构一致:
Response res = await dio.get("你的接口地址");
print(res.data.runtimeType); // 打印返回值类型
print(res.data); // 打印完整返回内容

JSON Placeholder的部分公开接口默认返回数组结构(比如/users接口返回所有用户的数组),如果请求地址写错也会触发该问题。

  • 第二步:根据实际返回结构调整解析逻辑
    情况1:接口外层确实返回包含目标对象的数组,示例结构如下:

    [
      {
        "response": {...},
        "status": {...},
        "data": {...}
      }
    ]
    

    调整解析代码,先取数组的第一项再传入模型解析:

    UserLogin? loginInfo;
    if(res.data is List && (res.data as List).isNotEmpty){
      loginInfo = UserLogin.fromJson(res.data[0]);
    }
    

    情况2:请求地址错误,需要调整为返回单条对象的接口,比如JSON Placeholder请求单条用户数据使用/users/1而不是/users。

  • 第三步:优化模型解析的容错逻辑,避免其他边界情况崩溃
    你当前的模型解析没有做空值和类型判断,字段异常时容易崩溃,可按如下调整:

// UserLogin的fromJson调整
factory UserLogin.fromJson(Map<String, dynamic> json) => UserLogin(
  response: json["response"] is Map ? Response.fromJson(json["response"]) : null,
  status: json["status"] is Map ? Status.fromJson(json["status"]) : null,
  data: json["data"] is Map ? Data.fromJson(json["data"]) : null,
);

// Response的datetime解析调整,避免时间格式异常崩溃
factory Response.fromJson(Map<String, dynamic> json) => Response(
  datetime: json["datetime"] is String ? DateTime.tryParse(json["datetime"]) : null,
  accessToken: json["accessToken"]?.toString(),
);

另外注意:dio默认会自动将接口返回的JSON字符串解析为对应类型的Dart对象,你不需要手动调用json.decode转字符串再解析,直接使用res.data即可。

内容的提问来源于stack exchange,提问作者ภาณุเดช ช่างทอง

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:36:02