Dart内置值反序列化对象列表

Jam*_*ist 3 dart flutter

我有一个返回对象列表的API ...

[{}, {}, {}, ...]
Run Code Online (Sandbox Code Playgroud)

我已经为每个对象都有一个已定义且可以正常工作的build_value模型。但是,现在我需要对列表进行反序列化。

我目前正在尝试这样的事情:

 List<Map<String, dynamic>> json = JSON.decode(DEMO_TASK);
 json.expand<Task>((Map<String, dynamic> map) => _serializers.deserializeWith<Task>(Task.serializer, map));
Run Code Online (Sandbox Code Playgroud)

但是,这会导致问题,因为它说_serializers.deserializeWith返回类型Task不是Iterable<Task>闭包定义的类型。

我要如何反序列化列表。我确定我缺少一些超级基础的东西。

Ili*_*tov 8

如果您想使用更通用的方法,可以使用以下代码段:如果有人需要此功能,我在这里留下如何处理这种情况的代码段(代码应放在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));
Run Code Online (Sandbox Code Playgroud)

所以如果你有json文件

[
  {
    "name": "test1",
    "result": "success"
  },
  {
    "name": "test2",
    "result": "fail"
  }
]
Run Code Online (Sandbox Code Playgroud)

并建立值类:

[
  {
    "name": "test1",
    "result": "success"
  },
  {
    "name": "test2",
    "result": "fail"
  }
]
Run Code Online (Sandbox Code Playgroud)

您可以使用deserializeListOf 上面的方法:

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;

}
Run Code Online (Sandbox Code Playgroud)


Jam*_*ist 6

对。我错过了一些基本的知识。我当时以为我正在使用流,但是由于它是一个列表,因此只需要.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();
Run Code Online (Sandbox Code Playgroud)