Flutter调用JSON序列化出现type ‘String‘ is not a subtype of type ‘MapString, dynamic‘

问题情况

本来按照书上的思路都封装好了Dio,半自动生成了Json Model,结果在实际应用上出现了以下异常:

Unhandled Exception: type 'String' is not a subtype of type 'Map<String, dynamic>'

该异常指向了我进行Json Model化的代码:(User为自己编写的Json Model类)

Response res = await dio.get<String>(...);
return User.fromJson(res.data); // 异常指向了这一行

分析原因:

初步分析是User.fromJson()需要传入Map而res.data的数据类型是String,但是用User.fromJson(res.data as Map<String, dynamic>)这样的写法依然不行。

后来翻书找到了原因,在JSON序列化之前需要用json.decode(json)将String转换为Map,例如:

Map userMap = json.decode(json);
var user = new User.fromJson(userMap);

解决方法

对res.data进行jsonDecode,原代码改成以下代码解决:

return Recommender.fromJson(jsonDecode(res.data));

后续发现的真问题所在和避免方法

后续写的代码发现dio.get(...)不用泛型指明返回类型也会报错。

该异常情况主要是与dio.get方法的返回值有关,如果是dio.get(...)这样使用的话它可能返回String也可能返回Map,所以建议指定泛型来避免异常,例如指定返回String则这样使用:dio.get<String>(...),实际使用代码如下:

Response res = await dio.get("url");
return User.fromJson(jsonDecode(res.data));

注:

本文所使用的环境和依赖:

environment:
  sdk: ">=2.12.0 <3.0.0"
dependencies:
  ...
  dio: ^4.0.0
  json_annotation: ^4.0.1
dev_dependencies:
  ...
  build_runner: ^2.0.1
  json_serializable: ^4.1.1
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@月琳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值