Flutter中如何对对象列表进行(反)序列化?
解决Flutter中Person对象列表的序列化/反序列化问题
看起来你在处理列表类型的序列化时踩了个小坑——单个对象的序列化方法没法直接套用到列表上,我来给你分两种常用的方案讲清楚怎么解决:
方案一:使用built_value库(对应你提到的serializers方式)
如果你的项目用的是built_value库来做序列化,那处理列表不需要额外封装Persons类,直接利用库自带的泛型类型支持就行:
1. 确保Person类的Serializer正确定义
先确认你的Person类是按照built_value规范生成的,比如:
part 'person.g.dart'; abstract class Person implements Built<Person, PersonBuilder> { Person._(); factory Person([void Function(PersonBuilder) updates]) = _$Person; String get name; int get age; static Serializer<Person> get serializer => _$personSerializer; }
2. 初始化Serializers时包含Person的Serializer
final serializers = (Serializers().toBuilder() ..add(Person.serializer)) .build();
3. 反序列化Person列表
不要用deserializeWith(这是给单个对象用的),改用deserialize方法并指定列表的泛型类型:
// 假设你的JSON字符串是一个数组格式 final jsonList = JSON.decode(jsonString) as List; final List<Person> persons = serializers.deserialize( jsonList, specifiedType: FullType(List, [FullType(Person)]), ) as List<Person>;
4. 序列化Person列表
同理,序列化列表时也要指定泛型类型:
final jsonList = serializers.serialize( persons, specifiedType: FullType(List, [FullType(Person)]), ); final jsonString = JSON.encode(jsonList);
方案二:使用json_serializable库(更轻量的选择)
如果你的项目用的是官方推荐的json_serializable,处理列表会更直观:
1. 定义Person类并生成序列化方法
import 'package:json_annotation/json_annotation.dart'; part 'person.g.dart'; @JsonSerializable() class Person { final String name; final int age; Person({required this.name, required this.age}); // 从JSON转对象 factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json); // 从对象转JSON Map<String, dynamic> toJson() => _$PersonToJson(this); }
2. 反序列化列表
直接遍历JSON数组,逐个转换为Person对象:
final jsonList = JSON.decode(jsonString) as List; final List<Person> persons = jsonList.map((item) => Person.fromJson(item as Map<String, dynamic>)).toList();
3. 序列化列表
遍历Person列表,逐个转为JSON对象再编码:
final jsonList = persons.map((person) => person.toJson()).toList(); final jsonString = JSON.encode(jsonList);
为什么你之前封装Persons类会报错?因为不管是built_value还是json_serializable,都已经原生支持列表类型的序列化,额外封装反而会让Serializer无法识别正确的类型,导致解析失败。
内容的提问来源于stack exchange,提问作者Ralph Bergmann
相关产品推荐
相关产品推荐

