Как десериализовать строку ISO данных в объект DateTime в сериализации built_value в dart?
Я хочу сериализовать объект json, включая ISOString
дату к объекту дротика, используя построенное значение.
это образец 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
как мне это исправить?
2 ответа
Решение
Вам нужно добавить кастомный
DateTime
сериализатор, который вы можете найти здесь:
- создать новый файл дротика (я назвал его iso8601_date_time_serializer.dart)
- вставьте код из Iso8601DateTimeSerializer1
- добавьте импорт в файл serializers.dart (import '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.
Вы можете импортироватьIso8601DateTimeSerializer
непосредственно изbuilt_value
- не копируйте файл в свой проект.
Ваш последнийserializers.dart
должно выглядеть так:
import 'package:built_value/iso_8601_date_time_serializer.dart';
import 'package:built_value/iso_8601_duration_serializer.dart';
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
part 'serializers.g.dart';
@SerializersFor([
// your built value classes
])
final Serializers serializers = (_$serializers.toBuilder()
..add(Iso8601DateTimeSerializer())
..add(Iso8601DurationSerializer())
..addPlugin(StandardJsonPlugin())
).build();