私は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
そうですね、あなたのサービスは、応答本体をマップとして、またはそれに応じてマップのリストとして処理します。あなたが持っているコードに基づくと、1 つの項目を考慮しています。
応答本文が反復可能な場合は、質問を正しく理解していれば、それに応じて解析して処理する必要があります。
例:
Iterable l = json.decode(response.body);
List<Post> posts = List<Post>.from(l.map((model)=> Post.fromJson(model)));
ここで、投稿は投稿のリストです。
編集: ここで明確にするためにメモを追加したいと思います。ここでの目的は、返された応答をデコードすることです。次のステップは、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 から少し離れています。そのため、構文が少しずれている可能性がありますが、これは疑似コードです。