代码生成库序列化JSON——json_serializable package
json_serializable package包, 它是一个自动化的源代码生成器,可以为我们生成JSON序列化模板。
由于序列化代码不再由我们手写和维护,我们将运行时产生JSON序列化异常的风险降至最低。
在pubspec.yaml中配置:
相关的最新版本
dependencies:
# Your other regular dependencies here
json_annotation: ^2.0.0
dev_dependencies:
# Your other dev_dependencies here
build_runner: ^1.0.0
json_serializable: ^2.0.0
将我们的User类转换为一个json_serializable
import 'package:json_annotation/json_annotation.dart';
// user.g.dart 将在我们运行生成命令后自动生成
part 'user.g.dart';
///这个标注是告诉生成器,这个类是需要生成Model类的
@JsonSerializable()
class User{
User(this.name, this.email);
String name;
String email;
//不同的类使用不同的mixin即可
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
json_serializable第一次创建类时,您会看到与下图类似的错误。
为了解决这个问题,我们必须运行代码生成器来为我们生成序列化模板。
- 一次性生成。通过在我们的项目根目录下运行flutter packages pub run build_runner build,我们可以在需要时为我们的model生成json序列化代码。 这触发了一次性构建,它通过我们的源文件,挑选相关的并为它们生成必要的序列化代码。但每次在model类中进行更改时都要手动运行构建命令。
- 持续生成使用_watcher_可以使我们的源代码生成的过程更加方便。它会监视我们项目中文件的变化,并在需要时自动构建必要的文件。我们可以通过flutter packages pub run
build_runner watch在项目根目录下运行来启动_watcher_。只需启动一次观察器,然后并让它在后台运行,这是安全的。
反序列化JSON字符串:
Map userMap = JSON.decode(json);
var user = new User.fromJson(userMap);
序列化:
String json = JSON.encode(user);