Как десериализовать строку 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сериализатор, который вы можете найти здесь:

  1. создать новый файл дротика (я назвал его iso8601_date_time_serializer.dart)
  2. вставьте код из Iso8601DateTimeSerializer1
  3. добавьте импорт в файл serializers.dart (import 'iso8601_date_time_serializer.dart';)
  4. отредактируйте ваши сериализаторы. 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();
Другие вопросы по тегам