JSON 序列化方式
- 手动序列化
- 借助插件生成 json_serializable
项目开发中使用手动序列化和 json_to_dart 在线转换工具更灵活高效
如何序列化
将 JSON 格式的字符串转为 Dart 对象,这个可以通过 dart:convert 中内置的 JSON 解码器 json.decode() 来实现,该方法可以根据 JSON 字符串具体内容将其转为 List 或 Map,这样我们就可以通过他们来查找所需的值,如:
//一个JSON格式的用户列表字符串
String jsonStr = '[{"name":"Jack"},{"name":"Rose"}]';
//将JSON字符串转为Dart对象(此处是List)
List items = json.decode(jsonStr);
print('${items[0]['name']}!');
print('${items[1]['name']}.');
String jsonStr = '{"name": "John Smith","email": "[email protected]"}';
Map map = json.decode(jsonStr);
print('Howdy, ${map['name']}!');
print('We sent the verification link to ${map['email']}.');
通过 json.decode() 将 JSON 字符串转为 List/Map 的方法比较简单,它没有外部依赖或其它的设置,对于小项目很方便。但在 List/Map 中存放那些字段在使用时很不方便也容易出错,这时将 List/Map 转成 Model 即可。
具体做法就是,通过预定义一些与 Json 结构对应的 Model 类,然后在请求到数据后再动态根据数据创建出 Model 类的实例。这样一来,在开发阶段我们使用的是 Model 类的实例,而不再是 Map/List,这样访问内部属性时就不会发生拼写错误。
例如,我们可以通过引入一个简单的模型类(Model class)来解决前面提到的问题,我们称之为 User。在 User 类内部,我们有:
- 一个
User.fromJson
构造函数, 用于从一个 map 构造出一个User
实例 map structure - 一个
toJson
方法, 将User
实例转化为一个 map.
class User {
String name;
String email;
User({this.name, this.email});
User.fromJson(Map json) {
name = json['name'];
email = json['email'];
}
Map toJson() {
Map data = new Map();
data['name'] = this.name;
data['email'] = this.email;
return data;
}
}
采用这种新方法,我们可以非常容易地反序列化 user.
String jsonStr = '{"name": "John Smith","email": "[email protected]"}';
Map userMap = json.decode(jsonStr);
var user = new User.fromJson(userMap);
print('Howdy, ${user.name}!');
print('We sent the verification link to ${user.email}.');
User 类字段修改成 final
class User {
final String name;
final String email;
User({this.name, this.email});
factory User.fromJson(Map json) {
return User(name: json['name'], email: json['email']);
}
Map toJson() {
Map data = new Map();
data['name'] = this.name;
data['email'] = this.email;
return data;
}
}
复杂 JSON 解析
解析对象中的数组
{
"url": "xxx",
"tabs": [
{
"labelName":"推荐",
"channelCode":"photo_global"
},
{
"labelName":"拍照",
"channelCode":"tab_photo"
}
]
}
解析:
class TravelModel {
String url;
List tabs;
TravelModel(this.url, this.tabs);
TravelModel.fromJson(Map json) {
url = json['url'];
if (json['tabs'] != null) {
tabs = new List();
json['tabs'].forEach((i) {
tabs.add(new TravelTab.fromJson(i));
});
}
}
Map toJson() {
final Map data = new Map();
data['url'] = this.url;
if (this.tabs != null) {
data['tabs'] = this.tabs.map((v) => v.toJson()).toList();
}
return data;
}
}
class TravelTab {
String labelName;
String channelCode;
TravelTab({this.labelName, this.channelCode});
TravelTab.fromJson(Map json) {
labelName = json['labelName'];
channelCode = json['channelCode'];
}
Map toJson() {
final Map data = new Map();
data['labelName'] = this.labelName;
data['channelCode'] = this.channelCode;
return data;
}
}
修改为 final
class TravelModel {
final String url;
final List tabs;
TravelModel({this.url, this.tabs});
factory TravelModel.fromJson(Map json) {
var tabsJson = json['tabs'] as List;
List tabs = tabsJson.map((i) => TravelTab.fromJson(i)).toList();
return TravelModel(url: json['url'], tabs: tabs);
}
Map toJson() {
final Map data = new Map();
data['url'] = this.url;
if (this.tabs != null) {
data['tabs'] = this.tabs.map((v) => v.toJson()).toList();
}
return data;
}
}
class TravelTab {
final String labelName;
final String channelCode;
TravelTab({this.labelName, this.channelCode});
factory TravelTab.fromJson(Map json) {
return TravelTab(
labelName: json['labelName'], channelCode: json['channelCode']);
}
Map toJson() {
final Map data = new Map();
data['labelName'] = this.labelName;
data['channelCode'] = this.channelCode;
return data;
}
}
在项目中设置 json_serializable
在项目中设置json_serializable---- json_serializable设置方式