上一章
Flutter 中Json的序列化和反序列化
Flutter中没有反射,所有不能使用类似gson的第三方序列化,但是flutter提供了一个 dart:convert的转化器,可以将json转化成map或者list。
使用方法
Map<String,dymanic> module=jsonDecode(json);
List<Map> list=jsonDecode(json);
但是这样写会导致module的类型不确定,导致编译器不会监测到类型问题,实际使用中会导致类型错误,为了防止出现这个问题,可以根据json创建module类,在module定义toJosn和fromJson方法。
example
class User {
final String name;
final String email;
User(this.name, this.email);
User.fromJson(Map<String, dynamic> json)
: name = json['name'],
email = json['email'];
Map<String, dynamic> toJson() =>
<String, dynamic>{
'name': name,
'email': email,
};
}
新问题来了,如果每个类都这么写就会很麻烦,官方提供了一个json_serializable都包,自动生成代码模版。 在dev_dependencies (这里是开发中使用包都位置,这里引用的包不会打包到app中)下面导入两个包
build_runner
json_serializable
example
dev_dependencies:
flutter_test:
sdk: flutter
json_serializable: ^3.2.5
build_runner: ^1.7.4
dart文件中
import 'package:json_annotation/json_annotation.dart';
part 'User.g.dart';
@JsonSerializable()
class User {
final String name;
final String email;
User(this.name, this.email);
factory User.fromJson(Map<String, dynamic> json)
=>_$UserFromJson(json);
Map<String, dynamic> toJson() =>_$UserToJson(this);
}
ps:一开始会报错,因为相关代码还没有生成。
在命令后输入:flutter packages pub run build_runner build
编译成功以后就会在同一目录下生成Use.g.dart文件,里面是相关的代码模板。