[英]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 文件要长得多。所以我想要得到的是“标题”的值,它是列表形式的A1和A2 ,因为我想将它用于 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.