3分钟
12 Json序列化
在 Flutter 中,json 序列化是有些特殊的,不同与 JS ,比如使用上述 Dio 网络请求返回,如果配置了返回数据格式为 json ,实际上的到会是一个Map。而 Map 的 key-value 使用,在开发过程中并不是很方便,所以你需要对Map 再进行一次转化,转为实际的 Model 实体。
所以 json_serializable
插件诞生了, 中文网Json 对其已有一段教程,这里主要补充说明下具体的使用逻辑。
dependencies:
# Your other regular dependencies here
json_annotation: ^0.2.2
dev_dependencies:
# Your other dev_dependencies here
build_runner: ^0.7.6
json_serializable: ^0.3.2
如下发代码所示:
- 创建你的实体 Model 之后,继承 Object 、然后通过
@JsonSerializable()
标记类名。 - 通过
with _$TemplateSerializerMixin
,将fromJson
方法委托到Template.g.dart
的实现中。 其中*.g.dart
、_$* SerializerMixin
、_$*FromJson
这三个的引入, 和 Model 所在的 dart 的文件名与 Model 类名有关,具体可见代码注释和后面图片。 - 最后通过
flutter packages pub run build_runner build
编译自动生成转化对象。(个人习惯完成后手动编译)
import 'package:json_annotation/json_annotation.dart';
///关联文件、允许Template访问 Template.g.dart 中的私有方法
///Template.g.dart 是通过命令生成的文件。名称为 xx.g.dart,其中 xx 为当前 dart 文件名称
///Template.g.dart中创建了抽象类_$TemplateSerializerMixin,实现了_$TemplateFromJson方法
part 'Template.g.dart';
///标志class需要实现json序列化功能
@JsonSerializable()
///'xx.g.dart'文件中,默认会根据当前类名如 AA 生成 _$AASerializerMixin
///所以当前类名为Template,生成的抽象类为 _$TemplateSerializerMixin
class Template extends Object with _$TemplateSerializerMixin {
String name;
int id;
///通过JsonKey重新定义参数名
@JsonKey(name: "push_id")
int pushId;
Template(this.name, this.id, this.pushId);
///'xx.g.dart'文件中,默认会根据当前类名如 AA 生成 _$AAeFromJson方法
///所以当前类名为Template,生成的抽象类为 _$TemplateFromJson
factory Template.fromJson(Map<String, dynamic> json) => _$TemplateFromJson(json);
}
上述操作生成后的 Template.g.dart
下的代码如下,这样我们就可以通过 Template.fromJson
和toJson
方法对实体与map进行转化,再结合json.decode
和 json.encode
,你就可以愉悦的在string 、map、实体间相互转化了。
part of 'Template.dart';
Template _$TemplateFromJson(Map<String, dynamic> json) => new Template(
json['name'] as String, json['id'] as int, json['push_id'] as int);
abstract class _$TemplateSerializerMixin {
String get name;
int get id;
int get pushId;
Map<String, dynamic> toJson() =>
<String, dynamic>{'name': name, 'id': id, 'push_id': pushId};
}
学员评价