json_serializable是dart官方推荐和提供的JSON转Model的方式:
一个自动化源代码生成器来为你生成 JSON 序列化数据模板;
由于序列化数据代码不再需要手动编写或者维护,你可以将序列化 JSON 数据在运行时的异常风险降到最低;
第一步:添加相关的依赖
依赖分为项目依赖(dependencies),开发依赖(dev_dependencies):
注意:需要执行flutter pub get确保我们的项目中有这些依赖
dependencies:
json_annotation: ^3.0.1
dev_dependencies:
json_serializable: ^3.2.5
build_runner: ^1.8.0
第二步:以json_serializable 的方式创建模型类
//以一个简单的Json数据作为例子
final jsonInfo = {
"nickname": "coderwhy",
"level": 18,
"courses": ["语文", "数学", "英语"],
"register_date": "2222-2-22",
"computer": {
"brand": "MackBook",
"price": 1000
}
};
创建对应的模型(以json_serializable 的方式,创建完成后代码是报错的)
- part 'user.g.dart'==>这个是之后json_serializable会自动帮助我们生成的文件
- JsonSerializable()==>注解:告诉json_serializable哪一个类需要进行转换
- JsonKey==>当映射关系不一样时,可以指定映射关系
- 另外,这里必须有我们的构造方法
- 需要有对应的工厂构造器==>UserToJson(this)调用的该方法目前会报错,需要json_serializable来生成
- 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}';
}
}
第三步:生成JSON序列化代码
在项目终端运行下面的指令:
-
该指令是生成一次JSON序列化的代码
-
flutter pub run build_runner build
或运行下面的指令:
-
会监听文件的改变,重新生成JSON序列化的代码
-
flutter pub run build_runner watch
第四步:测试代码
final jsonInfo = {
"nickname": "coderwhy",
"level": 18,
"courses": ["语文", "数学", "英语"],
"register_date": "2222-2-22",
"computer": {
"brand": "MackBook",
"price": 1000
}
};
final user = User.fromJson(jsonInfo);
print(user);
在线数据解析
网址:
1.网址1
2. 网址2
网址1在数据复杂的情况下,转化可能会出现异常,建议使用网址2