深色模式
Flutter json 序列化
在 Flutter 环境下,Dart 不能使用反射,所以必须明确实现 json 的序列化与反序列化方法。
纯手撸的方式,只适合小项目,而且容易出错。
所以,应该采用自动生成的方式。
json_serializable
json_serializable 库,可以用来为 Dart 实体类自动生成 json 的序列化与反序列化方法。
文档:GitHub: google/json_serializable.dart
安装
yaml
dependencies:
json_annotation: ^4.7.0
dev_dependencies:
build_runner: ^2.2.1
json_serializable: ^6.4.0
使用
假如有 json 结构如下:
json
{
"userId": 100,
"userName": "Jack"
}
在model.dart
文件中编写User
实体类,并添加@JsonSerializable()
注解,以及part 'model.g.dart';
指令:
dart
part 'model.g.dart';
@JsonSerializable()
class User {
int id;
String name;
User(this.id, this.name);
// or
// User({required this.id, required this.name});
}
命令行输入:
bash
flutter pub run build_runner build
会在model.dart
的父目录内生成model.g.dart
文件,其中有序列化与反序列化相关的函数:
dart
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'models.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Uber _$UberFromJson(Map<String, dynamic> json) => Uber()
..id = json['id'] as int
..name = json['name'] as String;
Map<String, dynamic> _$UberToJson(Uber instance) => <String, dynamic>{
'id': instance.id,
'name': instance.name,
};
然后引用这些函数:
dart
part 'models.g.dart';
@JsonSerializable()
class Uber {
int id = 0;
String name = "";
factory Uber.fromJson(Map<String, dynamic> json) => _$UberFromJson(json);
Map<String, dynamic> toJson() => _$UberToJson(this);
}
进阶
json_serializable
的进阶使用方式,参考: