Dart 内置值反序列化对象列表
Dart Built Value Deserialize List of Objects
我有一个 API return 对象列表...
[{}, {}, {}, ...]
我已经为每个对象定义了一个可用的 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
return 类型 Task
不是闭包定义的 Iterable<Task>
。
如何反序列化列表。我确定我错过了一些超级基本的东西。
是的。我错过了一些基本的东西。我以为我正在使用流,但由于它是一个列表,您只需在列表上使用 .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();
如果您想使用更通用的方法,可以使用以下代码片段:
如果有人需要此功能,我将在此处留下如何处理这种情况的代码片段(代码应放在 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"
}
]
和内置值class:
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);
我有一个 API return 对象列表...
[{}, {}, {}, ...]
我已经为每个对象定义了一个可用的 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
return 类型 Task
不是闭包定义的 Iterable<Task>
。
如何反序列化列表。我确定我错过了一些超级基本的东西。
是的。我错过了一些基本的东西。我以为我正在使用流,但由于它是一个列表,您只需在列表上使用 .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();
如果您想使用更通用的方法,可以使用以下代码片段:
如果有人需要此功能,我将在此处留下如何处理这种情况的代码片段(代码应放在 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"
}
]
和内置值class:
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);