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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:00:26