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

