在 Dart 中使用唯一键解析 JSON 对象
Parsing JSON Object with unique key in Dart
我很难弄清楚如何将具有唯一键的 JSON 响应解析到嵌套对象中。
我做了一些研究并看到了这篇文章 (https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51),但它没有给出带有 unique/random 键的 JSON 对象的示例。
请参阅下文,了解我从后端获得的 json 响应。学生用户名是唯一的(即 john354、kim553 等),并且可以随时添加新学生。有人能给我一个例子,说明我的模型对于这种类型的结构应该是什么样子,以及如何用 listview.builder 显示数据吗?非常感谢!
{
"school": {
"students": {
"john354": {
"fullName": "John Kindle",
"permissions": {
"permission1": "here",
"permission2": "here"
}
},
"kim553": {
"fullName": "Kim Johnson"
"permissions": {
"permission1": "here",
"permission2": "here"
}
},
"dory643": {
"fullName": "Dory Thomas"
"permissions": {
"permission1": "here",
"permission2": "here"
}
}
},
"footer": "Text goes here"
},
"status": {
"state": "open"
}
}
尝试数据模型
class School {
School school;
Status status;
School({this.school, this.status});
School.fromJson(Map<String, dynamic> json) {
school =
json['school'] != null ? new School.fromJson(json['school']) : null;
status =
json['status'] != null ? new Status.fromJson(json['status']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.school != null) {
data['school'] = this.school.toJson();
}
if (this.status != null) {
data['status'] = this.status.toJson();
}
return data;
}
}
class School {
Students students;
String footer;
School({this.students, this.footer});
School.fromJson(Map<String, dynamic> json) {
students = json['students'] != null
? new Students.fromJson(json['students'])
: null;
footer = json['footer'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.students != null) {
data['students'] = this.students.toJson();
}
data['footer'] = this.footer;
return data;
}
}
class Students {
final String username;
final Info info;
Options({this.username,this.info});
factory Students.fromJson(String name, Map<String, dynamic> json){
return Students(
username: username,
info: Info(
fullName: json['info']['fullName']
)
);
}
}
class Info {
String fullName;
Permissions permissions;
Info({this.fullName, this.permissions});
Info.fromJson(Map<String, dynamic> json) {
fullName = json['fullName'];
permissions = json['permissions'] != null
? new Permissions.fromJson(json['permissions'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['fullName'] = this.fullName;
if (this.permissions != null) {
data['permissions'] = this.permissions.toJson();
}
return data;
}
}
class Permissions {
String permission1;
String permission2;
Permissions({this.permission1, this.permission2});
Permissions.fromJson(Map<String, dynamic> json) {
permission1 = json['permission1'];
permission2 = json['permission2'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['permission1'] = this.permission1;
data['permission2'] = this.permission2;
return data;
}
}
class Status {
String state;
Status({this.state});
Status.fromJson(Map<String, dynamic> json) {
state = json['state'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['state'] = this.state;
return data;
}
}
为了简化 JSON 追求,您可以使用 app.quicktype.io 将 JSON 转换为 DART。
试试下面的数据模型,
import 'dart:convert';
School schoolFromJson(String str) => School.fromJson(json.decode(str));
String schoolToJson(School data) => json.encode(data.toJson());
class School {
School({
this.school,
this.status,
});
final SchoolClass school;
final Status status;
factory School.fromJson(Map<String, dynamic> json) => School(
school: SchoolClass.fromJson(json["school"]),
status: Status.fromJson(json["status"]),
);
Map<String, dynamic> toJson() => {
"school": school.toJson(),
"status": status.toJson(),
};
}
class SchoolClass {
SchoolClass({
this.students,
this.footer,
});
final Map<String, Student> students;
final String footer;
factory SchoolClass.fromJson(Map<String, dynamic> json) => SchoolClass(
students: Map.from(json["students"]).map((k, v) => MapEntry<String, Student>(k, Student.fromJson(v))),
footer: json["footer"],
);
Map<String, dynamic> toJson() => {
"students": Map.from(students).map((k, v) => MapEntry<String, dynamic>(k, v.toJson())),
"footer": footer,
};
}
class Student {
Student({
this.fullName,
this.permissions,
});
final String fullName;
final Permissions permissions;
factory Student.fromJson(Map<String, dynamic> json) => Student(
fullName: json["fullName"],
permissions: Permissions.fromJson(json["permissions"]),
);
Map<String, dynamic> toJson() => {
"fullName": fullName,
"permissions": permissions.toJson(),
};
}
class Permissions {
Permissions({
this.permission1,
this.permission2,
});
final String permission1;
final String permission2;
factory Permissions.fromJson(Map<String, dynamic> json) => Permissions(
permission1: json["permission1"],
permission2: json["permission2"],
);
Map<String, dynamic> toJson() => {
"permission1": permission1,
"permission2": permission2,
};
}
class Status {
Status({
this.state,
});
final String state;
factory Status.fromJson(Map<String, dynamic> json) => Status(
state: json["state"],
);
Map<String, dynamic> toJson() => {
"state": state,
};
}
要解析此 JSON 数据,请执行
final school = schoolFromJson(jsonString);
我很难弄清楚如何将具有唯一键的 JSON 响应解析到嵌套对象中。
我做了一些研究并看到了这篇文章 (https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51),但它没有给出带有 unique/random 键的 JSON 对象的示例。
请参阅下文,了解我从后端获得的 json 响应。学生用户名是唯一的(即 john354、kim553 等),并且可以随时添加新学生。有人能给我一个例子,说明我的模型对于这种类型的结构应该是什么样子,以及如何用 listview.builder 显示数据吗?非常感谢!
{
"school": {
"students": {
"john354": {
"fullName": "John Kindle",
"permissions": {
"permission1": "here",
"permission2": "here"
}
},
"kim553": {
"fullName": "Kim Johnson"
"permissions": {
"permission1": "here",
"permission2": "here"
}
},
"dory643": {
"fullName": "Dory Thomas"
"permissions": {
"permission1": "here",
"permission2": "here"
}
}
},
"footer": "Text goes here"
},
"status": {
"state": "open"
}
}
尝试数据模型
class School {
School school;
Status status;
School({this.school, this.status});
School.fromJson(Map<String, dynamic> json) {
school =
json['school'] != null ? new School.fromJson(json['school']) : null;
status =
json['status'] != null ? new Status.fromJson(json['status']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.school != null) {
data['school'] = this.school.toJson();
}
if (this.status != null) {
data['status'] = this.status.toJson();
}
return data;
}
}
class School {
Students students;
String footer;
School({this.students, this.footer});
School.fromJson(Map<String, dynamic> json) {
students = json['students'] != null
? new Students.fromJson(json['students'])
: null;
footer = json['footer'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.students != null) {
data['students'] = this.students.toJson();
}
data['footer'] = this.footer;
return data;
}
}
class Students {
final String username;
final Info info;
Options({this.username,this.info});
factory Students.fromJson(String name, Map<String, dynamic> json){
return Students(
username: username,
info: Info(
fullName: json['info']['fullName']
)
);
}
}
class Info {
String fullName;
Permissions permissions;
Info({this.fullName, this.permissions});
Info.fromJson(Map<String, dynamic> json) {
fullName = json['fullName'];
permissions = json['permissions'] != null
? new Permissions.fromJson(json['permissions'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['fullName'] = this.fullName;
if (this.permissions != null) {
data['permissions'] = this.permissions.toJson();
}
return data;
}
}
class Permissions {
String permission1;
String permission2;
Permissions({this.permission1, this.permission2});
Permissions.fromJson(Map<String, dynamic> json) {
permission1 = json['permission1'];
permission2 = json['permission2'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['permission1'] = this.permission1;
data['permission2'] = this.permission2;
return data;
}
}
class Status {
String state;
Status({this.state});
Status.fromJson(Map<String, dynamic> json) {
state = json['state'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['state'] = this.state;
return data;
}
}
为了简化 JSON 追求,您可以使用 app.quicktype.io 将 JSON 转换为 DART。
试试下面的数据模型,
import 'dart:convert';
School schoolFromJson(String str) => School.fromJson(json.decode(str));
String schoolToJson(School data) => json.encode(data.toJson());
class School {
School({
this.school,
this.status,
});
final SchoolClass school;
final Status status;
factory School.fromJson(Map<String, dynamic> json) => School(
school: SchoolClass.fromJson(json["school"]),
status: Status.fromJson(json["status"]),
);
Map<String, dynamic> toJson() => {
"school": school.toJson(),
"status": status.toJson(),
};
}
class SchoolClass {
SchoolClass({
this.students,
this.footer,
});
final Map<String, Student> students;
final String footer;
factory SchoolClass.fromJson(Map<String, dynamic> json) => SchoolClass(
students: Map.from(json["students"]).map((k, v) => MapEntry<String, Student>(k, Student.fromJson(v))),
footer: json["footer"],
);
Map<String, dynamic> toJson() => {
"students": Map.from(students).map((k, v) => MapEntry<String, dynamic>(k, v.toJson())),
"footer": footer,
};
}
class Student {
Student({
this.fullName,
this.permissions,
});
final String fullName;
final Permissions permissions;
factory Student.fromJson(Map<String, dynamic> json) => Student(
fullName: json["fullName"],
permissions: Permissions.fromJson(json["permissions"]),
);
Map<String, dynamic> toJson() => {
"fullName": fullName,
"permissions": permissions.toJson(),
};
}
class Permissions {
Permissions({
this.permission1,
this.permission2,
});
final String permission1;
final String permission2;
factory Permissions.fromJson(Map<String, dynamic> json) => Permissions(
permission1: json["permission1"],
permission2: json["permission2"],
);
Map<String, dynamic> toJson() => {
"permission1": permission1,
"permission2": permission2,
};
}
class Status {
Status({
this.state,
});
final String state;
factory Status.fromJson(Map<String, dynamic> json) => Status(
state: json["state"],
);
Map<String, dynamic> toJson() => {
"state": state,
};
}
要解析此 JSON 数据,请执行
final school = schoolFromJson(jsonString);