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

Dart中Built Value反序列化对象列表的实现问题

解决built_value列表反序列化的问题

嗨,我来帮你搞定这个问题~你遇到的错误其实是对expand方法的用法理解有点偏差,咱们一步步来梳理:

错误原因分析

你用json.expand<Task>(...)的时候,expand要求传入的闭包必须返回可迭代对象(Iterable),但_serializers.deserializeWith<Task>返回的是单个Task实例,类型不匹配自然就报错了。expand的作用是把每个元素"展开"成多个元素(比如把一个列表拆成单个元素集合),而咱们这里是要把每个Map一对一转换成Task,应该用map方法才对。

正确的实现方法

方法1:用map遍历转换

这是最直观的方式,遍历每个JSON对象,逐个反序列化为Task,最后转成List:

List<Map<String, dynamic>> jsonList = JSON.decode(DEMO_TASK);
List<Task> tasks = jsonList
    .map((Map<String, dynamic> map) => _serializers.deserializeWith(Task.serializer, map))
    .toList();

这里map会将每个Map转换成对应的Task,最后通过toList()把Iterable<Task>转换成List<Task>。

方法2:直接用序列化器的deserialize方法(更推荐)

built_value的序列化器支持直接指定复杂类型,比如List<Task>,这样代码更简洁,也更符合框架的设计思路:

List<Task> tasks = _serializers.deserialize(
  JSON.decode(DEMO_TASK),
  specifiedType: FullType(List, [FullType(Task)]),
) as List<Task>;

这里通过FullType明确告诉序列化器,我们要反序列化的是一个包含Task元素的列表类型,不需要手动遍历处理。

补充知识点

记住几个集合方法的核心区别:

  • map:一对一转换,每个元素对应一个新元素
  • expand:一对多转换,每个元素展开成多个元素(比如把[[1,2],[3]]转成[1,2,3])
    你之前误用了expand,换成map就解决类型匹配的问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:02