web-dev-qa-db-ja.com

flutterのjsonからオブジェクトのリストをデシリアライズする方法

Jsonのシリアル化にDartパッケージjson_serializableを使用しています。フラッタードキュメントを見ると、次のように1つのオブジェクトをデシリアライズする方法が示されています。

Future<Post> fetchPost() async {
  final response =
  await http.get('https://jsonplaceholder.typicode.com/posts/1');

  if (response.statusCode == 200) {
  // If the call to the server was successful, parse the JSON
  return Post.fromJson(json.decode(response.body));
  } else {
    // If that call was not successful, throw an error.
    throw Exception('Failed to load post');
  }
}

ただし、単一のインスタンスの代わりにアイテムのリストに対して同じことを行う方法を理解するほど、Dartに精通していません。

18
Gainz

さて、あなたのサービスは、応答本体をマップにするか、マップのリストをそれに応じて処理します。持っているコードに基づいて、1つのアイテムを計算しています。

応答本文が反復可能な場合、質問を正しく理解している場合、それに応じて解析して歩く必要があります。

例:

Iterable l = json.decode(response.body);
List<Post> posts = l.map((Map model)=> Post.fromJson(model)).toList();

ここで、postsは投稿のリストです。

EDIT:ここに明確さのメモを追加したかった。ここでの目的は、返された応答をデコードすることです。次のステップでは、jsonオブジェクトの反復可能オブジェクトをオブジェクトのインスタンスに変換します。これは、クラスにfromJsonメソッドを作成してjsonを適切に取得し、それに応じて実装することで実行されます。以下に実装例を示します。

class Post {
  // Other functions and properties relevant to the class
  // ......
  /// Json is a Map<dynamic,dynamic> if i recall correctly.
  static fromJson(json): Post {
    Post p = new Post()
    p.name = ...
    return p
  }
}

私は最近、Dartから少し抽象化されており、達成する必要のあるタスクのためのより良いユーティリティを支持しています。したがって、私の構文は少し外れている可能性がありますが、これは疑似コードです。

31
Fallenreaper

さらに明確にするためのJSON解析のもう1つの例です。

JSONオブジェクトの項目配列を解析するとします。

factory YoutubeResponse.fromJSON(Map<String, dynamic> YoutubeResponseJson) 
 {

// Below 2 line code is parsing JSON Array of items in our JSON Object (YouttubeResponse)


var list = YoutubeResponseJson['items'] as List;
List<Item> itemsList = list.map((i) => Item.fromJSON(i)).toList();

return new YoutubeResponse(
    kind: YoutubeResponseJson['kind'],
    etag: YoutubeResponseJson['etag'],
    nextPageToken: YoutubeResponseJson['nextPageToken'],
    regionCode: YoutubeResponseJson['regionCode'],
    mPageInfo: pageInfo.fromJSON(YoutubeResponseJson['pageInfo']),

    // Here we are returning parsed JSON Array.

    items: itemsList);

  }
8
Hammad Tariq