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
相关产品推荐
相关产品推荐

