built_value 反序列化遇到错误“类型 '_InternalLinkedHashMap<String,dynamic>' 不是类型转换中类型 'Iterable<dynamic>' 的子类型”

wal*_*ker 1 dart json-deserialization flutter

我的模型:

abstract class Post implements Built<Post, PostBuilder> {
    static Serializer<Post> get serializer => _$postSerializer;
    int get userId;
    int get id;
    String get title;
    String get body;
    factory Post([updates(PostBuilder b)]) = _$Post;
    Post._();
}
Run Code Online (Sandbox Code Playgroud)

我的要求:

Future<Post> getPostById(int id) async {
    final resp = await http.get('https://jsonplaceholder.typicode.com/posts/${id}');  
    if(resp.statusCode == 200) {
        return serializers.deserializeWith(Post.serializer, json.decode(resp.body));
    }else {
        throw Exception('Failed to load post');
    }
}
Run Code Online (Sandbox Code Playgroud)

以及源代码中的断点:

 if (serializer is StructuredSerializer) {
    try {
      // ===> HERE
      return serializer.deserialize(this, object as Iterable,
          specifiedType: specifiedType);
    } on Error catch (error) {
      throw new DeserializationError(object, specifiedType, error);
    }

 }else if(serializer is PrimitiveSerializer) {
     //...
 }
Run Code Online (Sandbox Code Playgroud)

错误:

发生异常。将“{userId:1,id:3,标题:eamolestiasquasiexeritationemrepellatquiipsa...”反序列化为“Post”失败,因为:类型“_InternalLinkedHashMap”不是类型转换中“Iterable”类型的子类型

我的问题是我的类型定义或反序列化用法有误,并且我在response.body(a Map) 中得到了一个对象,为什么代码执行 atas Iterable而不是PrimitiveSerializer指令。

wal*_*ker 6

关键是StandardJsonPlugin

我从官方示例中复制了serializers.dart文件:

@SerializersFor(const [
  Account,
  Cat,
  CompoundValue,
  Fish,
  GenericValue,
  SimpleValue,
  VerySimpleValue,
])
final Serializers serializers = _$serializers; // see this line
Run Code Online (Sandbox Code Playgroud)

但是当我在网络中查找时,人们使用这个:

final Serializers serializers = 
    (
      _$serializers.toBuilder()
      ..addPlugin(StandardJsonPlugin())
    ).build();
Run Code Online (Sandbox Code Playgroud)

当我添加StandardJsonPlugin.