1、JSON转模型,必然可以通过手动来进行转化:
-
优点:完全是自己可控的,并且需要哪些字段就转化哪些字段,对于不需要的,忽略即可;并且继承关系也会一目了然
-
缺点:麻烦,并且容易出错;
下面是我之前针对上面的数据,写的JSON转Model的模型类:
class Person {
String name;
String avatarURL;
Person.fromMap(Map<String, dynamic> json) {
this.name = json["name"];
this.avatarURL = json["avatars"]["medium"];
}
}
class Actor extends Person {
Actor.fromMap(Map<String, dynamic> json): super.fromMap(json);
}
class Director extends Person {
Director.fromMap(Map<String, dynamic> json): super.fromMap(json);
}
int counter = 1;
class MovieItem {
int rank;
String imageURL;
String title;
String playDate;
double rating;
List<String> genres;
List<Actor> casts;
Director director;
String originalTitle;
MovieItem.fromMap(Map<String, dynamic> json) {
this.rank = counter++;
this.imageURL = json["images"]["medium"];
this.title = json["title"];
this.playDate = json["year"];
this.rating = json["rating"]["average"];
this.genres = json["genres"].cast<String>();
this.casts = (json["casts"] asList<dynamic>).map((item) {
return Actor.fromMap(item);
}).toList();
this.director = Director.fromMap(json["directors"][0]);
this.originalTitle = json["original_title"];
}
}
2、json-serializable
json_serializable是dart官方推荐和提供的JSON转Model的方式:
-
一个自动化源代码生成器来为你生成 JSON 序列化数据模板;
-
由于序列化数据代码不再需要手动编写或者维护,你可以将序列化 JSON 数据在运行时的异常风险降到最低;
3.1添加相关依赖
依赖分为项目依赖(dependencies),开发依赖(dev_dependencies):
dependencies:
json_annotation:^3.0.1
dev_dependencies:
json_serializable:^3.2.5
build_runner:^1.8.0
3.2创建模型类
final jsonInfo = {
"nickname": "coderwhy",
"level": 18,
"courses": ["语文", "数学", "英语"],
"register_date": "2222-2-22",
"computer": {
"brand": "MackBook",
"price": 1000
}
};
创建对应的模型(以json_serializable 的方式,创建完成后代码是报错的)
-
1.part 'user.g.dart'
-
这个是之后json_serializable会自动帮助我们生成的文件
-
-
2.JsonSerializable()
-
注解:告诉json_serializable哪一个类需要进行转换
-
-
3.JsonKey
-
当映射关系不一样时,可以指定映射关系
-
-
4.另外,这里必须有我们的构造方法
-
5.需要有对应的工厂构造器
-
_UserFromJson(json)和_UserToJson(this)调用的该方法目前会报错,需要json_serializable来生成
-
-
6.toString方法不是必须的,是待会儿进行测试的
User类的代码:
import'package:json_annotation/json_annotation.dart';
import'model/computer.dart';
part'user.g.dart';
@JsonSerializable()
class User {
String name;
String email;
@JsonKey(name: "register_date")
String registerDate;
List<String> courses;
Computer computer;
User(this.name, this.email, this.registerDate, this.courses, this.computer);
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
@override
String toString() {
return'User{name: $name, email: $email, registerDate: $registerDate, courses: $courses, computer: $computer}';
}
}
Computer类的代码:
import'package:json_annotation/json_annotation.dart';
part'computer.g.dart';
@JsonSerializable()
class Computer {
String brand;
double price;
Computer(this.brand, this.price);
factory Computer.fromJson(Map<String, dynamic> json) => _$ComputerFromJson(json);
Map<String, dynamic> toJson() => _$ComputerToJson(this);
@override
String toString() {
return'Computer{brand: $brand, price: $price}';
}
}
3.生成程序代码
在项目终端运行下面的指令:
flutter pub run build_runner build
4.测试
final jsonInfo = {
"nickname": "coderwhy",
"level": 18,
"courses": ["语文", "数学", "英语"],
"register_date": "2222-2-22",
"computer": {
"brand": "MackBook",
"price": 1000
}
};
final user = User.fromJson(jsonInfo);
print(user);