【发布时间】:2020-09-04 15:51:37
【问题描述】:
我需要在颤振中解析一个复杂的 json(因为我是新手)。我已经做了很多事情,但是在我想要得到结果的某个地方,我得到了 NULL。我真的没有明白为什么吗?
还要生成我正在使用https://app.quicktype.io/ 网站的 PODO 文件,但是在右侧我不明白这是什么“将编码器和解码器放入课堂”。我试图谷歌但无法理解很多关于它,因为这个网站可以将 JSON 转换为多种语言。
这是JSON结构(包括这个链接,否则它会变得太长,答案):https://docs.google.com/document/d/1h_T6zmubYnqQFxPg944F-XJ4K2dQ2sFQGxmQNiUKK8o/edit?usp=sharing
PODO 文件是
// To parse this JSON data, do
//
// final moviesPage = moviesPageFromJson(jsonString);
import 'dart:convert';
List<MoviesPage> moviesPageFromJson(String str) => List<MoviesPage>.from(json.decode(str).map((x) => MoviesPage.fromJson(x)));
String moviesPageToJson(List<MoviesPage> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class MoviesPage {
MoviesPage({
this.movieBanners,
this.popular,
this.genre,
});
List<MovieBannerElement> movieBanners;
List<MovieBannerElement> popular;
List<MovieBannerElement> genre;
factory MoviesPage.fromJson(Map<String, dynamic> json) => MoviesPage(
movieBanners: json["movie_banners"] == null ? null : List<MovieBannerElement>.from(json["movie_banners"].map((x) => MovieBannerElement.fromJson(x))),
popular: json["popular"] == null ? null : List<MovieBannerElement>.from(json["popular"].map((x) => MovieBannerElement.fromJson(x))),
genre: json["genre"] == null ? null : List<MovieBannerElement>.from(json["genre"].map((x) => MovieBannerElement.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"movie_banners": movieBanners == null ? null : List<dynamic>.from(movieBanners.map((x) => x.toJson())),
"popular": popular == null ? null : List<dynamic>.from(popular.map((x) => x.toJson())),
"genre": genre == null ? null : List<dynamic>.from(genre.map((x) => x.toJson())),
};
}
class MovieBannerElement {
MovieBannerElement({
this.genreName,
this.movieId,
this.title,
this.tags,
this.genres,
this.thumbnail,
this.posterLink,
this.platform,
this.worldwide,
this.createdAt,
});
String genreName;
String movieId;
String title;
List<String> tags;
List<GenreEnum> genres;
List<String> thumbnail;
String posterLink;
Platform platform;
int worldwide;
DateTime createdAt;
factory MovieBannerElement.fromJson(Map<String, dynamic> json) => MovieBannerElement(
genreName: json["genre_name"] == null ? null : json["genre_name"],
movieId: json["movie_id"] == null ? null : json["movie_id"],
title: json["title"] == null ? null : json["title"],
tags: json["tags"] == null ? null : List<String>.from(json["tags"].map((x) => x)),
genres: json["genres"] == null ? null : List<GenreEnum>.from(json["genres"].map((x) => genreEnumValues.map[x])),
thumbnail: json["thumbnail"] == null ? null : List<String>.from(json["thumbnail"].map((x) => x)),
posterLink: json["poster_link"] == null ? null : json["poster_link"],
platform: json["platform"] == null ? null : platformValues.map[json["platform"]],
worldwide: json["WORLDWIDE"] == null ? null : json["WORLDWIDE"],
createdAt: json["createdAt"] == null ? null : DateTime.parse(json["createdAt"]),
);
Map<String, dynamic> toJson() => {
"genre_name": genreName == null ? null : genreName,
"movie_id": movieId == null ? null : movieId,
"title": title == null ? null : title,
"tags": tags == null ? null : List<dynamic>.from(tags.map((x) => x)),
"genres": genres == null ? null : List<dynamic>.from(genres.map((x) => genreEnumValues.reverse[x])),
"thumbnail": thumbnail == null ? null : List<dynamic>.from(thumbnail.map((x) => x)),
"poster_link": posterLink == null ? null : posterLink,
"platform": platform == null ? null : platformValues.reverse[platform],
"WORLDWIDE": worldwide == null ? null : worldwide,
"createdAt": createdAt == null ? null : createdAt.toIso8601String(),
};
}
enum GenreEnum { THE_5_E10_BFDF923885_A2149948_FF, THE_5_E10_BFE1923885_A214994907, THE_5_E10_BFE0923885_A214994903, THE_5_E10_BFDE923885_A2149948_FB, THE_5_E10_BFDC923885_A2149948_F7, THE_5_E10_BFE2923885_A21499490_B, THE_5_E10_BFE2923885_A21499490_D, THE_5_E10_BFDF923885_A2149948_FD, THE_5_E10_BFDE923885_A2149948_F9, THE_5_E10_BFE3923885_A214994911, THE_5_E10_BFE0923885_A214994905, THE_5_E10_BFE1923885_A214994909, THE_5_E10_BFE0923885_A214994901 }
final genreEnumValues = EnumValues({
"5e10bfdc923885a2149948f7": GenreEnum.THE_5_E10_BFDC923885_A2149948_F7,
"5e10bfde923885a2149948f9": GenreEnum.THE_5_E10_BFDE923885_A2149948_F9,
"5e10bfde923885a2149948fb": GenreEnum.THE_5_E10_BFDE923885_A2149948_FB,
"5e10bfdf923885a2149948fd": GenreEnum.THE_5_E10_BFDF923885_A2149948_FD,
"5e10bfdf923885a2149948ff": GenreEnum.THE_5_E10_BFDF923885_A2149948_FF,
"5e10bfe0923885a214994901": GenreEnum.THE_5_E10_BFE0923885_A214994901,
"5e10bfe0923885a214994903": GenreEnum.THE_5_E10_BFE0923885_A214994903,
"5e10bfe0923885a214994905": GenreEnum.THE_5_E10_BFE0923885_A214994905,
"5e10bfe1923885a214994907": GenreEnum.THE_5_E10_BFE1923885_A214994907,
"5e10bfe1923885a214994909": GenreEnum.THE_5_E10_BFE1923885_A214994909,
"5e10bfe2923885a21499490b": GenreEnum.THE_5_E10_BFE2923885_A21499490_B,
"5e10bfe2923885a21499490d": GenreEnum.THE_5_E10_BFE2923885_A21499490_D,
"5e10bfe3923885a214994911": GenreEnum.THE_5_E10_BFE3923885_A214994911
});
enum Platform { YOUTUBE, POPCORNFLIX }
final platformValues = EnumValues({
"popcornflix": Platform.POPCORNFLIX,
"youtube": Platform.YOUTUBE
});
class EnumValues<T> {
Map<String, T> map;
Map<T, String> reverseMap;
EnumValues(this.map);
Map<T, String> get reverse {
if (reverseMap == null) {
reverseMap = map.map((k, v) => new MapEntry(v, k));
}
return reverseMap;
}
}
关键是当我勾选“将编码器和解码器放入类中”的初始行时:
List<MoviesPage> moviesPageFromJson(String str) => List<MoviesPage>.from(json.decode(str).map((x) => MoviesPage.fromJson(x)));
String moviesPageToJson(List<MoviesPage> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
消失。我的意思是如何解析 JSON
我已经创建了这样的服务文件:
类 ServicesForMoviesPage { 静态常量字符串 url = “https://livetvapi.apyhi.com/api/v3/home?pageLocation=movies&countries=IN&app_version=13&” "user_id=44edc2c905ae163f&package_id=livetv.movies.freemovies.watchtv.tvshows&os_platform=android";
static Future<List<String>> loadDataForPopularMovies() async {
var res = await http
.get(url, headers: {'Authorization': dartJsonWebTokenGenerator()});
List<MovieBannerElement> popularObjectList = [];
if (res.statusCode == 200) {
print("response is there for movies Page");
final List<MoviesPage> moviesPageObjectList =
moviesPageFromJson(res.body);
print("Movies page.........pppppppppppppppp................");
for (int i = 0; i <= moviesPageObjectList.length; i++) {
popularObjectList = moviesPageObjectList[i].popular;
print("PopularObjectList");
print(popularObjectList);
}
List<String> popular_movie_Id = [];
for (int i = 0; i < popularObjectList.length; i++) {
popular_movie_Id.add(popularObjectList[i].movieId);
}
return popular_movie_Id;
} else {
print("no response");
return null;
}
}
这里的 moviesPageObjectList[i].popular 返回 null。但是为什么?
它还说:
final moviesPage = moviesPageFromJson(jsonString);
解析数据,其实是:
final List<MoviesPage> moviesPageObjectList =
moviesPageFromJson(res.body);
正是在这里,MoviesPage 列表和后续的东西真的让我很生气,正如我打印和看到的那样,生成了一个列表列表,然后生成了一个 NULL 元素列表。
有没有更简单的方法来解析 JSON 数据,比如转换成 XML 或任何其他格式并进行操作?
【问题讨论】: