Flutter 官方是不推荐使用反射来进行对象转换,因为它影响性能造成卡顿等问题。使用反射需要依赖dart:mirrors
库,然而dart:mirrors
库在Flutter中是不被支持的。
上网查了一些方案,推荐使用json_annotation
+json_serializable
+build_runner
,自动生成映射关系方案。
首先在pubspec.yaml
添加依赖:
...
dependencies:
...
json_annotation: ^4.9.0 # json注解库
dev_dependencies:
...
json_serializable: ^6.8.0
build_runner: ^2.4.11
...
创建一个模型account_book.dart
import 'package:json_annotation/json_annotation.dart';
part 'account_book.g.dart'; // 这一行需要手动写
abstract class SModel {
SModel.fromJson(Map data);
Map<String, dynamic> toJson();
}
class AccountBook extends SModel {
// 添加一些属性
@JsonKey(required: true)
late int id = 0;
@JsonKey(required: true)
late String name;
@JsonKey(defaultValue: 0)
late int order = 0;
// 先建构造方法
AccountBook() : super.fromJson({});
factory AccountBook.fromJson(data) {
throw UnimplementedError();
}
}
在命令行运行 build_runner
来生成 account_book.g.dart
的转换文件,每次更新和新增都需要调用。
dart run build_runner build
运行完成后就可以在目录上看到account_book.g.dart
查看
account_book.g.dart
文件可以看到有两个转换方法
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'account_book.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
AccountBook _$AccountBookFromJson(Map<String, dynamic> json) {
$checkKeys(
json,
requiredKeys: const ['id', 'name'],
);
return AccountBook()
..id = (json['id'] as num).toInt()
..name = json['name'] as String
..order = (json['order'] as num?)?.toInt() ?? 0;
}
Map<String, dynamic> _$AccountBookToJson(AccountBook instance) =>
<String, dynamic>{
'id': instance.id,
'name': instance.name,
'order': instance.order,
};
将这两个方法写到account_book.dart
模型里面即可
import 'package:json_annotation/json_annotation.dart';
part 'account_book.g.dart'; // 这一行需要手动写
class AccountBook {
// 添加一些属性
@JsonKey(required: true)
late int id = 0;
@JsonKey(required: true)
late String name;
@JsonKey(defaultValue: 0)
late int order = 0;
// 先建构造方法
AccountBook() : super.fromJson({});
// 转对象
factory AccountBook.fromJson(data) => _$AccountBookFromJson(data);
// 转Map
Map<String, dynamic> toJson() => _$AccountBookToJson(this);
}
使用方式
var accountBook = AccountBook.fromJson({"id":1, "name": "我的"});
print('${accountBook.toJson()}');