Flutterアプリを作成しており、MovieDB APIを使用してデータを取得しています。 APIを呼び出して特定の映画を要求すると、これが返される一般的な形式です。
{
"adult": false,
"backdrop_path": "/wrqUiMXttHE4UBFMhLHlN601MZh.jpg",
"belongs_to_collection": null,
"budget": 120000000,
"genres": [
{
"id": 28,
"name": "Action"
},
{
"id": 12,
"name": "Adventure"
},
{
"id": 878,
"name": "Science Fiction"
}
],
"homepage": "http://www.rampagethemovie.com",
"id": 427641,
"imdb_id": "tt2231461",
"original_language": "en",
"original_title": "Rampage",
...
}
これを解析するためのモデルクラスを設定しました。クラスは次のように定義されています。
import 'Dart:async';
class MovieDetail {
final String title;
final double rating;
final String posterArtUrl;
final backgroundArtUrl;
final List<Genre> genres;
final String overview;
final String tagline;
final int id;
const MovieDetail(
{this.title, this.rating, this.posterArtUrl, this.backgroundArtUrl, this.genres, this.overview, this.tagline, this.id});
MovieDetail.fromJson(Map jsonMap)
: title = jsonMap['title'],
rating = jsonMap['vote_average'].toDouble(),
posterArtUrl = "http://image.tmdb.org/t/p/w342" + jsonMap['backdrop_path'],
backgroundArtUrl = "http://image.tmdb.org/t/p/w500" + jsonMap['poster_path'],
genres = (jsonMap['genres']).map((i) => Genre.fromJson(i)).toList(),
overview = jsonMap['overview'],
tagline = jsonMap['tagline'],
id = jsonMap['id'];
}
class Genre {
final int id;
final String genre;
const Genre(this.id, this.genre);
Genre.fromJson(Map jsonMap)
: id = jsonMap['id'],
genre = jsonMap['name'];
}
私の問題は、JSONからジャンルを適切に解析できないことです。 JSONを取得してモデルクラスに渡すと、次のエラーが表示されます。
I/flutter (10874): type 'List<dynamic>' is not a subtype of type 'List<Genre>' where
I/flutter (10874): List is from Dart:core
I/flutter (10874): List is from Dart:core
I/flutter (10874): Genre is from package:flutter_app_first/models/movieDetail.Dart
Genre
オブジェクトに別のクラスを作成し、JSON配列でリストとして渡したため、これがうまくいくと思いました。キーワードdynamic
がanyオブジェクトを意味しないので、List<dynamic>
がList<Genre>
の子ではないことを理解できませんか?ネストされたJSON配列をカスタムオブジェクトに解析する方法を知っている人はいますか?
genres = (jsonMap['genres'] as List).map((i) => Genre.fromJson(i)).toList()
を試してください
問題:キャストなしでmap
を呼び出すと、動的呼び出しになります。つまり、Genre.fromJson
からの戻り値の型も(ジャンルではなく)動的になります。
ヒントについては https://flutter.io/json/ をご覧ください。
https://pub.dartlang.org/packages/json_serializable のような解決策があります。
JSONtoDart Converter は非常に便利です。試してみてください...