【问题标题】:How to parse a complex Json which is a List of Maps in flutter?如何解析复杂的 Json,它是颤动的地图列表?
【发布时间】: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.movi​​es.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 或任何其他格式并进行操作?

【问题讨论】:

    标签: json flutter parsing dart


    【解决方案1】:

    这样的工厂函数就可以了

     factory MovieBannerElement.fromJson(Map<String, dynamic> json) {
           
            try {
              MovieBannerElement object = MovieBannerElement(
            movieId: json['movie_id'],
            title: json['title'],
            ...
          );
    
          return object;
        } catch (e) {
          return null;
        }
      }
    

    但我找不到 json 共享的“流派名称”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-08
      • 2021-10-10
      • 2021-06-01
      • 2019-09-06
      • 2021-06-26
      • 2020-08-30
      • 2020-04-04
      • 2021-08-18
      相关资源
      最近更新 更多