built_value如何将json数组反序列化为对象数组?

时间:2018-08-07 07:56:14

标签: json serialization flutter

在built_value的官方example中,展示了如何设置对象的数组成员:

abstract class Collections implements Built<Collections, CollectionsBuilder> {
  static Serializer<Collections> get serializer => _$collectionsSerializer;

  BuiltList<int> get list;
  BuiltMap<String, int> get map;
  BuiltListMultimap<int, bool> get listMultimap;

  factory Collections([updates(CollectionsBuilder b)]) = _$Collections;
  Collections._();
}

它只是演示了如何反序列化地图,而不是数组,数组只是键/成员,而不是数据本身。

但是在某些情况下,我的http响应本身就是一个数组,而不是作为响应的成员播放。

我的模特:

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

我的要求是:

static Future<List<Post>> getPosts() async {
  final response = await http.get('https://jsonplaceholder.typicode.com/posts');
  if (response.statusCode == 200) {
    return serializers.deserialize(
        json.decode(response.body), 
        specifiedType: FullType(Post)
      );
  } else {
    throw Exception('Failed to load post');
  }
}

response.body:

[
  {'userId': 1, 'title': 'title1'},
  {'userId': 2, 'title': 'title2'}
]

我查阅了每个教程或网络讨论,没有人提到这种情况,还是应该只迭代response.body并反序列化以逐个反对?例如:

static Future<List<Post>> getPosts() async {
  final response = await http.get('https://jsonplaceholder.typicode.com/posts');
  if (response.statusCode == 200) {
    final List<dynamic> data = json.decode(response.body);
    return data.map((m){
      return serializers.deserializeWith(Post.serializer, m);
    }).toList();
  } else {
    throw Exception('Failed to load post');
  }
}

1 个答案:

答案 0 :(得分:1)

根据@David Morgan的reply,built_value还不支持反序列化列表。

  

当前没有等效于deserializeWith的列表。您需要一个一个地反序列化。