1. ホーム
  2. json

[解決済み] flutterでjsonからオブジェクトのリストをデシリアライズする方法

2022-11-28 13:01:05

質問

jsonのシリアライズにdartパッケージのjson_serializableを使用しています。flutterのドキュメントを見ると、次のように単一のオブジェクトをデシリアライズする方法が示されています。

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に十分に精通していない。

どのように解決するのですか?

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

もし私があなたの質問を正しく理解しているならば、レスポンスボディが反復可能であるならば、あなたはそれに応じてパースし、歩く必要があります。

例を挙げます。

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

ここで、postは投稿のLISTである。

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から少し抽象化されています。 そのため、私の構文はほんの少しずれている可能性がありますが、これは擬似コードです。