如何在flutter中反序列化动态密钥json



我想反序列化JSON文件,但我不知道如何从该文件构建模型。我想知道我的代码是对是错

{
"Thriller": [
{
"Death Clique": "https://www.youtube.com/watch?v=4Q9lTjqQeBU&ab_channel=VMovies"
},
{
"CID": "https://www.youtube.com/watch?v=4Q9lTjqQeBU&ab_channel=VMovies"
},
{
"Wrong Turn": "https://www.youtube.com/watch?v=9spc-dExLH0&ab_channel=SagarForever"
},

],
"Action Movie": [
{
"Nobody": "https://nobodymovie.com"
},
{
"Tenet": "https://tenetmovie.com"
},

],
"Romantic Movie": [
{
"Titanic": "https://titanicmovie.com"
},
{
"The Vow": "https://thevowmovie.com"
},

]
}

我构建这个模型是为了获取(惊悚片、动作片(等键以显示在列表中,并在列表内部以网格视图显示值(电影名称(

class MovieCategories {
final String? title;
final List<Movie>? subServices;
MovieCategories({ this.title, this.subServices});
factory MovieCategories.fromJson(Map<String, dynamic> json) {
var list = json.values as List;
List<Movie> imagesList = list.map((i) => Movie.fromJson(i)).toList();
return MovieCategories(
title: json.keys.toString(),
subServices: imagesList,
);
}
}
class Movie {
final String? title;
final String? url;
Movie({this.title, this.url});
factory Movie.fromJson(Map<String, dynamic> parsedJson){
return Movie(
title:parsedJson.keys.toString(),
url:parsedJson.values.toString()
);
}
}

我还建议遵循正确的键值对JSON约定,如:

{
[
{
"genre":"thriller",
"movies": [
{
"title": "Nobody",
"url": "https://nobodymovie.com"
},
{
"title": "Tenet",
"url": "https://tenetmovie.com"
}
]
...
}

这样一来,映射将更加直接:

class Movie {
final String? title;
final String? url;
Movie({this.title, this.url});
factory Movie.fromJson(Map<String, dynamic> parsedJson){
return Movie(
title: parsedJson['title'],
url: parsedJson['url']
);
}
}

以及您的电影类别*:

class MovieCategories {
final String? genre;
final List<Movie>? movies;
MovieCategories({this.genre, this.movies});
factory MovieCategories.fromJson(
String cat, <Map<String, String> genre) {
return MovieCategories(
genre: genre['genre'],
movies: genre['movies'].map((m) => Movie.fromJson(m)).toList(),
);
}
}

如果您的数据是这样的常量,那么您可以尝试此代码。

import 'dart:convert';
/// Map<String, List<Map<String, String>>>
class MovieCategories {
final String? title;
final List<Movie>? subServices;
MovieCategories({this.title, this.subServices});
factory MovieCategories.fromJson(
String cat, List<Map<String, String>>? movies) {
return MovieCategories(
title: cat,
subServices: movies?.map((m) => Movie.fromJson(m)).toList(),
);
}
static List<MovieCategories> fromJsonMaps(String jsonString) {
final _listOfMovies =
Map<String, List<Map<String, String>>>.from(jsonDecode(jsonString));
return _listOfMovies.keys
.map((cat) => MovieCategories.fromJson(cat, _listOfMovies[cat]))
.toList();
}
}
class Movie {
final String? title;
final String? url;
Movie({this.title, this.url});
factory Movie.fromJson(Map<String, String> parsedJson) {
return Movie(title: parsedJson.keys.first, url: parsedJson.values.first);
}
}

最新更新