build_value反序列化得到错误“类型转换中类型'_InternalLinkedHashMap <string,dynamic =“”>'不是类型'Iterable <dynamic>'的子类型”

时间:2018-07-27 12:55:16

标签: dart flutter json-deserialization

我的模特:

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._();
}

我的要求:

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');
    }
}

和源代码中的断点位于:

 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) {
     //...
 }

错误:

  

发生异常。   将'{userId:1,id:3,标题:ea quisti exercitationem repellat qui ipsa ...'反序列化为'Post'失败,原因是:类型_InternalLinkedHashMap在类型转换中不是'Iterable'类型的子类型

我的问题是我在类型定义或反序列化用法上错了,并且我在response.body(a Map)中得到一个对象,为什么代码在as Iterable而不是{{1 }}指令。

1 个答案:

答案 0 :(得分:0)

密钥是StandardJsonPlugin

我从官方example复制了serializers.dart文件:

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

但是当我在网络中查询时,人们会使用它:

final Serializers serializers = 
    (
      _$serializers.toBuilder()
      ..addPlugin(StandardJsonPlugin())
    ).build();

并确保当我添加StandardJsonPlugin时它也对我有用。