web-dev-qa-db-ja.com

Dartにオブジェクトのネストされた配列を持つJSONを解析しますか?

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配列でリストとして渡したため、これがうまくいくと思いました。キーワードdynamicanyオブジェクトを意味しないので、List<dynamic>List<Genre>の子ではないことを理解できませんか?ネストされたJSON配列をカスタムオブジェクトに解析する方法を知っている人はいますか?

12
rakeshdas

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 のような解決策があります。

19
Kevin Moore

JSONtoDart Converter は非常に便利です。試してみてください...

0
Mital Joshi