3

我想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

我该如何解决?

4

1 回答 1

1

您需要添加一个DateTime可以在此处找到的自定义序列化程序:Iso8601DateTimeSerializer

  1. 创建一个新的 dart 文件(我将其命名为iso8601_date_time_serializer.dart
  2. 从1粘贴代码
  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 问题 454得到了答案

于 2021-01-05T10:29:38.427 回答