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

Posted

技术标签:

【中文标题】built_value 如何将 json 数组反序列化为对象数组?【英文标题】:How does built_value deserialize json array to object array? 【发布时间】:2019-01-14 05:48:09 【问题描述】:

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

【问题讨论】:

Dart Built Value Deserialize List of Objects的可能重复 【参考方案1】:

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

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

【讨论】:

以上是关于built_value 如何将 json 数组反序列化为对象数组?的主要内容,如果未能解决你的问题,请参考以下文章

怎么将一个数组序列化与反序列化????越详细越好!!!可以加分

在项目中是否有任何合理的方法将json_serializable模型和build_value模型进行混合?

Flutter json 2 model with Built Value

使用 Newtonsoft 访问对象内的数组

第 35 题:如何实现字符串反序?

C#反序化json字符串,不用区分大小写