繁体   English   中英

如何获取 json 文件中的列表,其中包含 flutter dart 中的复杂数据

[英]how to get a list in a json file with complex data in flutter dart

我在这里有一些嵌套的 json 数据:

 [
    {
        "title": "A1",
        "startPage": 2,
        "totalPage": 10,
        "endPage": 11,
        "astartPage": 33,
        "aendPage": 42,
        "subtitle1": [
            {
                "subname1": "A11",
                "s1startPage": 2,
                "s1endPage": 9,
                "subtitle2": [
                    {
                        "subname2": "A111",
                        "s2startPage": 2,
                        "s2endPage": 2,
                        "subtitle3": [
                            {
                                "subname3": "A1111"
                            },
                            {
                                "subname3": "A1112"
                            }
                        ]
                    },
                    {
                        "subname2": "A112",
                        "s2startPage": 2,
                        "s2endPage": 3,
                        "subtitle3": [
                            {
                                "subname3": "A1121"
                            },
                            {
                                "subname3": "A1122"
                            }
                        ]
                    }
                ]
            },
            {
                "subname1": "A12",
                "s1startPage": 9,
                "s1endPage": 10,
                "subtitle2": [
                    {
                        "subname2": "A121",
                        "s2startPage": 9,
                        "s2endPage": 9,
                        "subtitle3": [
                            {
                                "subname3": "A1211"
                            }
                        ]
                    },
                    {
                        "subname2": "A122",
                        "s2startPage": 9,
                        "s2endPage": 9,
                        "subtitle3": [
                            {
                                "subname3": "A1221"
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "title": "A2",
        "startPage": 2,
        "totalPage": 10,
        "endPage": 11,
        "astartPage": 33,
        "aendPage": 42,
        "subtitle1": [
            {
                "subname1": "A21",
                "s1startPage": 2,
                "s1endPage": 9,
                "subtitle2": [
                    {
                        "subname2": "A211",
                        "s2startPage": 2,
                        "s2endPage": 2,
                        "subtitle3": [
                            {
                                "subname3": "A2111"
                            },
                            {
                                "subname3": "A2112"
                            }
                        ]
                    },
                    {
                        "subname2": "A212",
                        "s2startPage": 2,
                        "s2endPage": 3,
                        "subtitle3": [
                            {
                                "subname3": "A2121"
                            },
                            {
                                "subname3": "A2122"
                            }
                        ]
                    }
                ]
            },
            {
                "subname1": "A22",
                "s1startPage": 9,
                "s1endPage": 10,
                "subtitle2": [
                    {
                        "subname2": "A221",
                        "s2startPage": 9,
                        "s2endPage": 9,
                        "subtitle3": [
                            {
                                "subname3": "A2211"
                            }
                        ]
                    },
                    {
                        "subname2": "A222",
                        "s2startPage": 9,
                        "s2endPage": 9,
                        "subtitle3": [
                            {
                                "subname3": "A2221"
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

我使用这个例子是因为我的实际 json 文件要长得多。所以我想要得到的是“标题”的值,它是列表形式的A1A2 ,因为我想将它用于 flutter 中的扩展图块. 我已经在这里创建了 model:

class Naglist {
  final List<Title> titles;

  Naglist({
    this.titles,
  });


    factory Naglist.fromJson(List<dynamic> parsedJson) {

    List<Title> title = new List<Title>();
    title = parsedJson.map((i)=>Title.fromJson(i)).toList();

    return new Naglist(
      titles: title,
    );
  }

}

class Title {
    

    final String title;
    final int startPage;
    final int totalPage;
    final int endPage;
    final int astartPage;
    final int aendPage;
    final List<Subtitle1> subtitle1;
    
    Title({this.title,this.astartPage,this.totalPage,this.endPage,this.startPage,this.aendPage,this.subtitle1});

    factory Title.fromJson(Map<String, dynamic> parsedJson){

      var list = parsedJson['subtitle1'] as List;
      //print(list.runtimeType);
      List<Subtitle1> subtitle1list =  list!=null? list.map((i) => Subtitle1.fromJson(i)).toList():new List<Subtitle1>();


    return Title(
      title: parsedJson['title'],
      startPage: parsedJson['startPage'],
      totalPage: parsedJson['totalPage'],
      endPage:parsedJson['endPage'],
      astartPage: parsedJson['astartPage'],
      aendPage: parsedJson['aendPage'],
      subtitle1: subtitle1list
    );
    }
}
class Subtitle1 {
   

    final String subname1;
    final int s1startPage;
    final int s1endPage;
    final List<Subtitle2> subtitle2;
    
    Subtitle1({this.subname1,this.s1startPage,this.s1endPage,this.subtitle2});


    factory Subtitle1.fromJson(Map<String, dynamic> parsedJson){

      var list = parsedJson['subtitle2'] as List;
      //print(list.runtimeType);
      List<Subtitle2> subtitle2list = list!=null? list.map((i) => Subtitle2.fromJson(i)).toList(): new List<Subtitle2>();


    return Subtitle1(
      subname1: parsedJson['subname1'],
      s1startPage: parsedJson['s1startPage'],
      s1endPage:parsedJson['s1endPage'],
      subtitle2: subtitle2list 
    );
    }

}


class Subtitle2 {
    
    final String subname2;
    final int s2startPage;
    final int s2endPage;
    final List<Subtitle3> subtitle3;

    Subtitle2({this.subname2,this.s2startPage,this.s2endPage,this.subtitle3});
    
    factory Subtitle2.fromJson(Map<String, dynamic> parsedJson){

      var list = parsedJson['subtitle3'] as List;
      //print(list.runtimeType);
      List<Subtitle3> subtitle3list = list!=null?list.map((i) => Subtitle3.fromJson(i)).toList():new List<Subtitle3>();


    return Subtitle2(
      subname2: parsedJson['subname2'],
      s2startPage: parsedJson['s2startPage'],
      s2endPage:parsedJson['s2endPage'],
      subtitle3: subtitle3list 
    );
    }
}

class Subtitle3 {

  final String subname3;
  
  Subtitle3({this.subname3});


  factory Subtitle3.fromJson(Map<String, dynamic> parsedJson){

 return Subtitle3(
   subname3:parsedJson['subname3']
 );
} 

}

所以我真的不知道如何转换为列表,除了从这个文件中获取特定数据..请帮助我解析 json 数据的新手..

我使用此代码获取特定数据:

Future<String> _loadNagAdultFromAsset() async {
  return await rootBundle.loadString('assets/Adult.json');
}

Future  nagAdult() async {
  dynamic jsonString = await _loadNagAdultFromAsset();
  var jsonResponse = json.decode(jsonString);
  Naglist naglist = Naglist.fromJson(jsonResponse);
  print(naglist.titles);
  print(naglist.titles[0].title);
}

打印['Title' 的实例,'Title' 的实例]A1

让我们假设final myList = Naglist(....);

然后使用

final myTitleList = myList.titles.map((t) => t.title).toList();

有很多方法可以实现这一目标。 覆盖标题 class 的toString方法的最简单方法。

  @override
  String toString() => title;

现在,如果您愿意, naglist.titles ,它将打印 [A, B]

尝试使用以下 class 结构。

class Naglist {
  String title;
  int startPage;
  int totalPage;
  int endPage;
  int astartPage;
  int aendPage;
  List<Subtitle1> subtitle1;

  Naglist(
      {this.title,
      this.startPage,
      this.totalPage,
      this.endPage,
      this.astartPage,
      this.aendPage,
      this.subtitle1});

  Naglist.fromJson(Map<String, dynamic> json) {
    title = json['title'];
    startPage = json['startPage'];
    totalPage = json['totalPage'];
    endPage = json['endPage'];
    astartPage = json['astartPage'];
    aendPage = json['aendPage'];
    if (json['subtitle1'] != null) {
      subtitle1 = new List<Subtitle1>();
      json['subtitle1'].forEach((v) {
        subtitle1.add(new Subtitle1.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['title'] = this.title;
    data['startPage'] = this.startPage;
    data['totalPage'] = this.totalPage;
    data['endPage'] = this.endPage;
    data['astartPage'] = this.astartPage;
    data['aendPage'] = this.aendPage;
    if (this.subtitle1 != null) {
      data['subtitle1'] = this.subtitle1.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Subtitle1 {
  String subname1;
  int s1startPage;
  int s1endPage;
  List<Subtitle2> subtitle2;

  Subtitle1({this.subname1, this.s1startPage, this.s1endPage, this.subtitle2});

  Subtitle1.fromJson(Map<String, dynamic> json) {
    subname1 = json['subname1'];
    s1startPage = json['s1startPage'];
    s1endPage = json['s1endPage'];
    if (json['subtitle2'] != null) {
      subtitle2 = new List<Subtitle2>();
      json['subtitle2'].forEach((v) {
        subtitle2.add(new Subtitle2.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['subname1'] = this.subname1;
    data['s1startPage'] = this.s1startPage;
    data['s1endPage'] = this.s1endPage;
    if (this.subtitle2 != null) {
      data['subtitle2'] = this.subtitle2.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Subtitle2 {
  String subname2;
  int s2startPage;
  int s2endPage;
  List<Subtitle3> subtitle3;

  Subtitle2({this.subname2, this.s2startPage, this.s2endPage, this.subtitle3});

  Subtitle2.fromJson(Map<String, dynamic> json) {
    subname2 = json['subname2'];
    s2startPage = json['s2startPage'];
    s2endPage = json['s2endPage'];
    if (json['subtitle3'] != null) {
      subtitle3 = new List<Subtitle3>();
      json['subtitle3'].forEach((v) {
        subtitle3.add(new Subtitle3.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['subname2'] = this.subname2;
    data['s2startPage'] = this.s2startPage;
    data['s2endPage'] = this.s2endPage;
    if (this.subtitle3 != null) {
      data['subtitle3'] = this.subtitle3.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Subtitle3 {
  String subname3;

  Subtitle3({this.subname3});

  Subtitle3.fromJson(Map<String, dynamic> json) {
    subname3 = json['subname3'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['subname3'] = this.subname3;
    return data;
  }
}

尝试

import 'dart:convert';

List<Title> titleFromJson(String str) => List<Title>.from(json.decode(str).map((x) => Title.fromJson(x)));

String titleToJson(List<Title> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Title {
    Title({
        this.title,
        this.startPage,
        this.totalPage,
        this.endPage,
        this.astartPage,
        this.aendPage,
        this.subtitle1,
    });

    String title;
    int startPage;
    int totalPage;
    int endPage;
    int astartPage;
    int aendPage;
    List<Subtitle1> subtitle1;

    factory Title.fromJson(Map<String, dynamic> json) => Title(
        title: json["title"] == null ? null : json["title"],
        startPage: json["startPage"] == null ? null : json["startPage"],
        totalPage: json["totalPage"] == null ? null : json["totalPage"],
        endPage: json["endPage"] == null ? null : json["endPage"],
        astartPage: json["astartPage"] == null ? null : json["astartPage"],
        aendPage: json["aendPage"] == null ? null : json["aendPage"],
        subtitle1: json["subtitle1"] == null ? null : List<Subtitle1>.from(json["subtitle1"].map((x) => Subtitle1.fromJson(x))),
    );

    Map<String, dynamic> toJson() => {
        "title": title == null ? null : title,
        "startPage": startPage == null ? null : startPage,
        "totalPage": totalPage == null ? null : totalPage,
        "endPage": endPage == null ? null : endPage,
        "astartPage": astartPage == null ? null : astartPage,
        "aendPage": aendPage == null ? null : aendPage,
        "subtitle1": subtitle1 == null ? null : List<dynamic>.from(subtitle1.map((x) => x.toJson())),
    };
}

class Subtitle1 {
    Subtitle1({
        this.subname1,
        this.s1StartPage,
        this.s1EndPage,
        this.subtitle2,
    });

    String subname1;
    int s1StartPage;
    int s1EndPage;
    List<Subtitle2> subtitle2;

    factory Subtitle1.fromJson(Map<String, dynamic> json) => Subtitle1(
        subname1: json["subname1"] == null ? null : json["subname1"],
        s1StartPage: json["s1startPage"] == null ? null : json["s1startPage"],
        s1EndPage: json["s1endPage"] == null ? null : json["s1endPage"],
        subtitle2: json["subtitle2"] == null ? null : List<Subtitle2>.from(json["subtitle2"].map((x) => Subtitle2.fromJson(x))),
    );

    Map<String, dynamic> toJson() => {
        "subname1": subname1 == null ? null : subname1,
        "s1startPage": s1StartPage == null ? null : s1StartPage,
        "s1endPage": s1EndPage == null ? null : s1EndPage,
        "subtitle2": subtitle2 == null ? null : List<dynamic>.from(subtitle2.map((x) => x.toJson())),
    };
}

class Subtitle2 {
    Subtitle2({
        this.subname2,
        this.s2StartPage,
        this.s2EndPage,
        this.subtitle3,
    });

    String subname2;
    int s2StartPage;
    int s2EndPage;
    List<Subtitle3> subtitle3;

    factory Subtitle2.fromJson(Map<String, dynamic> json) => Subtitle2(
        subname2: json["subname2"] == null ? null : json["subname2"],
        s2StartPage: json["s2startPage"] == null ? null : json["s2startPage"],
        s2EndPage: json["s2endPage"] == null ? null : json["s2endPage"],
        subtitle3: json["subtitle3"] == null ? null : List<Subtitle3>.from(json["subtitle3"].map((x) => Subtitle3.fromJson(x))),
    );

    Map<String, dynamic> toJson() => {
        "subname2": subname2 == null ? null : subname2,
        "s2startPage": s2StartPage == null ? null : s2StartPage,
        "s2endPage": s2EndPage == null ? null : s2EndPage,
        "subtitle3": subtitle3 == null ? null : List<dynamic>.from(subtitle3.map((x) => x.toJson())),
    };
}

class Subtitle3 {
    Subtitle3({
        this.subname3,
    });

    String subname3;

    factory Subtitle3.fromJson(Map<String, dynamic> json) => Subtitle3(
        subname3: json["subname3"] == null ? null : json["subname3"],
    );

    Map<String, dynamic> toJson() => {
        "subname3": subname3 == null ? null : subname3,
    };
}

   Future  nagAdult() async {
      dynamic jsonString = await _loadNagAdultFromAsset();
      var jsonResponse = json.decode(jsonString);
      List<Title> naglist = titleFromJson(jsonResponse);
      for(Title title in naglist){
      print(title[0].title);
}
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM