前言
在一般编程语言中实例对象转化为json都是比较方便,但是dart例外,因为Flutter禁用了反射,所以序列化比较麻烦。这里推荐使用 json_serializable 库,主要用来简化dart对象与json对象的转化,以及Json序列化和反序列化代码的自动生成。
json_serializable
安装依赖
flutter pub add json_annotation
dart pub add dev:json_serializable
dart pub add dev:build_runner
json_annotation用来定义注解。json_serializable使用注解生成代码。build_runner执行命令生成代码。
使用
创建模型类user.dart
import 'package:json_annotation/json_annotation.dart';
// 1.指定生成的文件
part 'user.g.dart';
// 2.添加注解,告知此类是要生成Model类的
@JsonSerializable()
class User {
// 3.可选,添加注解设置此属性对应的json key
@JsonKey(name: 'name')
final String name;
final int age;
User({required this.name, required this.age});
// 4、反序列化,固定写法:_${类名}FromJson(json)
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
// 5、序列化,固定写法:_${类名}ToJson(this)
Map<String, dynamic> toJson() => _$UserToJson(this);
}
然后执行命令生成user.g.dart文件
flutter pub run build_runner build --delete-conflicting-outputs
注意:--delete-conflicting-outputs 是可选项,会自动删除任何现存文件。 user.g.dart文件:
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'user.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
User _$UserFromJson(Map<String, dynamic> json) => User(
name: json['name'] as String,
age: (json['age'] as num).toInt(),
);
Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{
'name': instance.name,
'age': instance.age,
};
json字符串转化为dart对象
String jsonStr = '{"name":"xiao","age":20}';
Map<String, dynamic> userMap = jsonDecode(jsonStr);
User u = User.fromJson(userMap);
dart对象转化为json
User user = new User(name: "hehe", age: 99);
Map<String, dynamic> userMap = user.toJson();
String str = jsonEncode(userMap);