如何在 dart 中的 built_value 序列化中将 Date ISO 字符串反序列化为 DateTime 对象?
How to deserialize Date ISO String to DateTime Object in built_value serialization in dart?
我想使用内置值将包含 ISOString
日期的 json 对象序列化为 dart 对象。
这是一个示例 json:
{
"title": "test",
"description": "test description",
"date": "2020-06-05T11:42:38.585Z",
"creator": {
"email": "test@test.com"
}
}
这是型号:
abstract class Post implements Built<Post, PostBuilder> {
@nullable
@BuiltValueField(wireName: '_id')
String get id;
String get title;
String get description;
DateTime get date;
@nullable
User get creator;
Post._();
static Serializer<Post> get serializer => _$postSerializer;
factory Post([updates(PostBuilder b)]) = _$Post;
factory Post.fromJson(Map<String, dynamic> map) =>
serializers.deserializeWith(Post.serializer, map);
Map<String, dynamic> toJson() =>
serializers.serializeWith(Post.serializer, this);
}
这是错误:
Deserializing '[title, test1, description, test1 description, date, 2020-06-05T...' to
'Post' failed due to: Deserializing '2020-06-05T11:42:38.585Z' to 'DateTime' failed due
to: type 'String' is not a subtype of type 'int' in type cast
我该如何解决?
您需要添加自定义 DateTime
序列化程序,您可以在此处找到:Iso8601DateTimeSerializer
- 新建一个dart文件(我命名为iso8601_date_time_serializer.dart)
- 粘贴来自 1
的代码
- 将导入添加到您的 serializers.dart 文件中(导入 'iso8601_date_time_serializer.dart';)
- 编辑你的序列化器。g.dart 文件
Serializers _$serializers = (new Serializers().toBuilder()
..add(Iso8601DateTimeSerializer())
..add(Post.serializer) // I assume you have this in yours
..addPlugin(StandardJsonPlugin()))
.build();
请注意,如果您使用 build_runner
重新生成代码,此修改可能会被删除。
如果你想深入挖掘,我从built_value GitHub issue 454
那里得到了答案
我想使用内置值将包含 ISOString
日期的 json 对象序列化为 dart 对象。
这是一个示例 json:
{
"title": "test",
"description": "test description",
"date": "2020-06-05T11:42:38.585Z",
"creator": {
"email": "test@test.com"
}
}
这是型号:
abstract class Post implements Built<Post, PostBuilder> {
@nullable
@BuiltValueField(wireName: '_id')
String get id;
String get title;
String get description;
DateTime get date;
@nullable
User get creator;
Post._();
static Serializer<Post> get serializer => _$postSerializer;
factory Post([updates(PostBuilder b)]) = _$Post;
factory Post.fromJson(Map<String, dynamic> map) =>
serializers.deserializeWith(Post.serializer, map);
Map<String, dynamic> toJson() =>
serializers.serializeWith(Post.serializer, this);
}
这是错误:
Deserializing '[title, test1, description, test1 description, date, 2020-06-05T...' to
'Post' failed due to: Deserializing '2020-06-05T11:42:38.585Z' to 'DateTime' failed due
to: type 'String' is not a subtype of type 'int' in type cast
我该如何解决?
您需要添加自定义 DateTime
序列化程序,您可以在此处找到:Iso8601DateTimeSerializer
- 新建一个dart文件(我命名为iso8601_date_time_serializer.dart)
- 粘贴来自 1 的代码
- 将导入添加到您的 serializers.dart 文件中(导入 'iso8601_date_time_serializer.dart';)
- 编辑你的序列化器。g.dart 文件
Serializers _$serializers = (new Serializers().toBuilder()
..add(Iso8601DateTimeSerializer())
..add(Post.serializer) // I assume you have this in yours
..addPlugin(StandardJsonPlugin()))
.build();
请注意,如果您使用 build_runner
重新生成代码,此修改可能会被删除。
如果你想深入挖掘,我从built_value GitHub issue 454
那里得到了答案