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

Flutter与Dart中内置类的正确序列化方法问询

Dart内置集合(Map/LinkedList)的JSON序列化方案

一、Map类的序列化

dart:core 中的 Map 属于JSON序列化默认支持的类型,只要它的键值对都是可序列化类型(比如字符串、数字等基础类型,或是实现了 toJson 方法的自定义类),直接调用 jsonEncode(myMap) 即可完成序列化,无需额外处理。

比如你的自定义类已通过 @JsonSerializable 生成了 toJson 方法,那么包含该类实例的Map可以直接序列化:

final myMap = {'key': MyEntryItem()};
String jsonStr = jsonEncode(myMap); // 正常执行

二、LinkedList类的序列化

dart:collection 的 LinkedList 不在JSON序列化的默认支持列表中,这就是你调用 jsonEncode(myLinkedList) 抛出 JsonUnsupportedObjectError 的原因。解决思路是将 LinkedList 转换为默认支持的结构(比如 List)再进行序列化,反序列化时则逆向操作。

序列化操作

由于你的 myEntryItem 已通过 @JsonSerializable 生成了 toJson 方法,只需先将 LinkedList 转为包含对应JSON结构的 List,再执行序列化:

// 方式1:分步转换
var serializableList = myLinkedList.map((item) => item.toJson()).toList();
String s = jsonEncode(serializableList);

// 方式2:直接链式调用
String s = jsonEncode(myLinkedList.map((e) => e.toJson()).toList());

反序列化操作

先将JSON字符串解析为 List,再遍历列表把每个元素转为 myEntryItem 实例,最后添加到 LinkedList 中:

// 解析JSON为List
var decodedList = jsonDecode(s) as List<dynamic>;

// 重建LinkedList
final myLinkedList = LinkedList<myEntryItem>();
for (var itemMap in decodedList) {
  myLinkedList.add(myEntryItem.fromJson(itemMap as Map<String, dynamic>));
}

进阶:自定义全局序列化逻辑

如果需要频繁处理 LinkedList 的序列化,可以自定义一个带转换器的JSON编码器,避免每次手动转换:

final customJsonEncoder = JsonEncoder.withIndent('  ', (object) {
  if (object is LinkedList) {
    return object.map((e) => e.toJson()).toList();
  }
  // 其他类型使用默认处理逻辑
  return object;
});

// 使用自定义编码器序列化LinkedList
String s = customJsonEncoder.convert(myLinkedList);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:51:13