Dart Built Value反序列化对象列表

8
我有一个API返回对象列表...
[{}, {}, {}, ...]

我已经有一个定义好且可用的built_value对象模型。然而,现在我需要对列表进行反序列化处理。
目前,我正在尝试以下操作:
 List<Map<String, dynamic>> json = JSON.decode(DEMO_TASK);
 json.expand<Task>((Map<String, dynamic> map) => _serializers.deserializeWith<Task>(Task.serializer, map));

然而,这会导致问题,因为它表示_serializers.deserializeWith返回类型Task不是由闭包定义的Iterable<Task>

我该如何对列表进行反序列化。我确定我错过了非常基础的东西。

2个回答

21

如果您希望采用更通用的方法,可以使用以下代码片段: 如果有人需要此功能,我在此留下处理此情况的代码片段(代码应放置在serializers.dart文件中):

Serializers standardSerializers = (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();

T deserialize<T>(dynamic value) =>
    standardSerializers.deserializeWith<T>(standardSerializers.serializerForType(T), value);

BuiltList<T> deserializeListOf<T>(dynamic value) =>
    BuiltList.from(value.map((value) => deserialize<T>(value)).toList(growable: false));

所以如果您有JSON文件。
[
  {
    "name": "test1",
    "result": "success"
  },
  {
    "name": "test2",
    "result": "fail"
  }
]

并创建值类:

import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';

part 'test_class.g.dart';

abstract class TestClass implements Built<TestClass, TestClassBuilder> {

  String get name;
  String get result;

  TestClass._();

  factory TestClass([updates(TestClassBuilder b)]) = _$TestClass;

  static Serializer<TestClass> get serializer => _$testClassSerializer;

}

您可以使用上述的deserializeListOf方法,如下所示:
import 'package:path_to_your_serializers_file/serializers.dart';

final BuiltList<TestClass> listOfTestClasses = deserializeListOf<TestClass>(json);

JSON 不是字符串,而是列表,因为使用了 <<JSON.decode(DEMO_TASK)>>。 - sgelves
1
我在这段代码上遇到了问题,猜测是由于Dart的后续版本。我已经在以下链接中概述了它们,这是我猜测您对相关git问题的回复:https://github.com/google/built_value.dart/issues/565#issuecomment-1132439225 有什么想法吗? - anqit

11

是的,我忽略了一些基础知识。我以为我在使用一个流,但实际上由于它是一个列表,你只需要在列表上使用.map函数。

List<Map<String, dynamic>> json = JSON.decode(DEMO_TASK);
    List<Task> tasks = json.map<Task>((Map<String, dynamic> map) => _serializers.deserializeWith<Task>(Task.serializer, map)).toList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接