Flutter中的JSON和序列化
Flutter中的JSON和序列化
前言:本篇文章适合已经了解Dart基础语法的情况下阅读,若你对于Dart的一些基础语法还不熟悉,请移步于Dart中文网先学习基础语法,在阅读本篇文章:http://dart.goodev.org/guides/language/language-tour#classes
1.在模型类中序列化JSON
JSON:
{
"name": "John Smith",
"email": "john@example.com"
}
引入dart:convert库,jsonDecode(jsonString)可以将JSON字符串转换成Map,jsonEncode(Object)方法将对象转换成JSON字符串。我们只需要建一个模型类将Map和对象相互转换就可以实现序列化。
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() =>
{
'name': name,
'email': email,
};
}
新建user.dart,新建一个fromJson命名构造函数,传入Map即可将Map转化成User对象,toJson函数,将对象转换成Map。
Map userMap = jsonDecode(jsonString);//jsonDecode将JSON字符串转换成Map
var user = new User.fromJson(userMap);//调用命名构造函数获取到获取到对象
print('Howdy, ${user.name}!');
print('We sent the verification link to ${user.email}.');
如果要对User进行编码,直接将User对象传递给jsonEncode(user)方法,不需要再调用toJson()方法,因为jsonEncode()已经将这一步做了。
String json = jsonEncode(user);
但是,现实世界的场景通常不会那么简单。您不太可能使用如此小的JSON响应体。嵌套的JSON对象也是常有的。
2.使用代码生成库序列化JSON
json_serializable包,这是一个自动生成的源代码生成器,可为您生成JSON序列化样板。
由于序列化代码不再是手动或手动维护的,因此可以最大限度地降低在运行时出现JSON序列化异常的风险。
在项目中使用json_serializable,您需要一个常规依赖项和两个dev依赖项。简而言之,dev依赖项是我们的应用程序源代码中未包含的依赖项 - 它们仅在开发环境中使用。
pubspec.yaml
dependencies:
...
json_annotation: ^2.0.0
dev_dependencies:
...
build_runner: ^1.0.0
json_serializable: ^2.0.0
单击编辑器上方的Packages get下载这些包
以json_serializable方式创建模型类
user.dart
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class User extends Object {
@JsonKey(name: 'name')
String name;
@JsonKey(name: 'email')
String email;
User(this.name,this.email,);
factory User.fromJson(Map<String, dynamic> srcJson) => _$UserFromJson(srcJson);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
代码可以根据以下工具一键生成:https://caijinglong.github.io/json2dart/index_ch.html
第一次创建json_serializable类时,会出现以下错误:
1.png有两种运行代码生成器的方法。
一次性代码生成
通过运行flutter包,在项目根目录中运行build_runner build,可以在需要时为模型生成JSON序列化代码。这会触发一次性构建,该构建遍历源文件,选择相关文件,并为它们生成必要的序列化代码。
尽管这是很方便的,每次当你对你的模型类做了修改的时候,你没必要每次都去手动运行一次。
持续性地生成代码
观察者使我们的源代码生成过程更加方便。它会监听项目文件中的更改,并在需要时自动构建必要的文件。通过在项目根目录中运行flutter packages pub run build_runner watch来启动观察程序。
启动观察器一次,然后把它扔在后台运行是安全的。
使用json_serializable模型:
String jsonData = "{\"name\": \"EasonZzz\",\"eamil\": \"450622967@qq.com\"}";
User user = User.fromJson(jsonDecode(jsonData));