Je crée une application Flutter et j'utilise l'API MovieDB pour obtenir des données. Lorsque j'appelle l'api et demande un film spécifique, c'est le format général que je récupère:
{
"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",
...
}
J'ai configuré une classe modèle pour analyser ceci et la classe est définie comme telle:
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'];
}
Mon problème est que je ne parviens pas à faire analyser correctement le genre à partir du JSON. Lorsque j'obtiens le JSON et le passe dans ma classe de modèle, j'obtiens l'erreur suivante:
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
J'ai pensé que cela fonctionnerait parce que j'ai créé une classe différente pour l'objet Genre
et passé dans le tableau JSON sous forme de liste. Je ne comprends pas comment List<dynamic>
n'est pas un enfant de List<Genre>
parce que le mot clé dynamic
n'implique pas tout objet? Quelqu'un sait-il comment analyser un tableau JSON imbriqué dans des objets personnalisés?
Essayez genres = (jsonMap['genres'] as List).map((i) => Genre.fromJson(i)).toList()
Le problème: appeler map
sans le cast en fait un appel dynamique, ce qui signifie que le type de retour de Genre.fromJson
est également dynamique (pas Genre).
Jetez un oeil à https://flutter.io/json/ pour quelques conseils.
Il existe des solutions, comme https://pub.dartlang.org/packages/json_serializable , qui rendent cela beaucoup plus facile
Je pense que JSONtoDart Converter est très utile, faut essayer ...