Flutter 使用 json_serializable序列化j
2019-09-26 本文已影响0人
kindom_0129
Flutter使用中json、model转换是个麻烦事,官方文档中提供了一种使用方式来序列化json.
json_serializable package包: 它是一个自动化的源代码生成器,可以为我们生成JSON序列化模板。
由于序列化代码不再由我们手写和维护,我们将运行时产生JSON序列化异常的风险降至最低。
具体步骤:
1.在项目中设置json_serializable
要包含json_serializable到我们的项目中,我们需要一个常规和两个开发依赖项。简而言之,开发依赖项是不包含在我们的应用程序源代码中的依赖项。
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
然后在项目根文件夹中运行 flutter packages get (或者在编辑器中点击 “Packages Get”) 以在项目中使用这些新的依赖项.
2.代码部分
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);
}
注意:必须加上@JsonSerializable()已告知此类需要序列化,此时会有几个错误,无需理会,当命令执行完后会自动解决。
如果需要,自定义命名策略也很容易。例如,如果我们正在使用的API返回带有【snake_case】的对象,但我们想在我们的模型中使用lowerCamelCase, 那么我们可以使用@JsonKey标注:
/// Tell json_serializable that "registration_date_millis" should be
/// mapped to this property.
@JsonKey(name: 'registration_date_millis')
final int registrationDateMillis;
3.运行代码生成器来为我们生成序列化模板
首先到项目根目录下,之后有两种运行代码生成器的方法
- 一次性生成:
flutter packages pub run build_runner build
- 持续生成
使用watcher可以使我们的源代码生成的过程更加方便。它会监视我们项目中文件的变化,并在需要时自动构建必要的文件。
只需启动一次观察器,然后并让它在后台运行,这是安全的。
flutter packages pub run build_runner watch
注意:如果已经生成过了(产生了xxx.g.dart文件),再执行命令时会报错,需要删除原来的.g.dart文件。可以手动删除也可以在命令行里添加--delete-conflicting-outputs来删除
flutter packages pub run build_runner build --delete-conflicting-outputs
4.如何使用
要通过json_serializable方式反序列化JSON字符串,我们不需要对先前的代码进行任何更改。
Map userMap = JSON.decode(json);
var user = new User.fromJson(userMap);
序列化也一样。调用API与之前相同。
String json = JSON.encode(user);