JSON 序列化方式
- 手動(dòng)序列化
- 借助插件生成 json_serializable
項(xiàng)目開(kāi)發(fā)中使用手動(dòng)序列化和 json_to_dart 在線轉(zhuǎn)換工具更靈活高效
如何序列化
將 JSON 格式的字符串轉(zhuǎn)為 Dart 對(duì)象,這個(gè)可以通過(guò) dart:convert 中內(nèi)置的 JSON 解碼器 json.decode() 來(lái)實(shí)現(xiàn)晦攒,該方法可以根據(jù) JSON 字符串具體內(nèi)容將其轉(zhuǎn)為 List 或 Map民珍,這樣我們就可以通過(guò)他們來(lái)查找所需的值斯辰,如:
//一個(gè)JSON格式的用戶列表字符串
String jsonStr = '[{"name":"Jack"},{"name":"Rose"}]';
//將JSON字符串轉(zhuǎn)為Dart對(duì)象(此處是List)
List items = json.decode(jsonStr);
print('${items[0]['name']}!');
print('${items[1]['name']}.');
String jsonStr = '{"name": "John Smith","email": "john@example.com"}';
Map<String, dynamic> map = json.decode(jsonStr);
print('Howdy, ${map['name']}!');
print('We sent the verification link to ${map['email']}.');
通過(guò) json.decode() 將 JSON 字符串轉(zhuǎn)為 List/Map 的方法比較簡(jiǎn)單替蔬,它沒(méi)有外部依賴或其它的設(shè)置,對(duì)于小項(xiàng)目很方便馁龟。但在 List/Map 中存放那些字段在使用時(shí)很不方便也容易出錯(cuò)怨酝,這時(shí)將 List/Map 轉(zhuǎn)成 Model 即可啦扬。
具體做法就是,通過(guò)預(yù)定義一些與 Json 結(jié)構(gòu)對(duì)應(yīng)的 Model 類凫碌,然后在請(qǐng)求到數(shù)據(jù)后再動(dòng)態(tài)根據(jù)數(shù)據(jù)創(chuàng)建出 Model 類的實(shí)例扑毡。這樣一來(lái),在開(kāi)發(fā)階段我們使用的是 Model 類的實(shí)例盛险,而不再是 Map/List瞄摊,這樣訪問(wèn)內(nèi)部屬性時(shí)就不會(huì)發(fā)生拼寫(xiě)錯(cuò)誤。
例如苦掘,我們可以通過(guò)引入一個(gè)簡(jiǎn)單的模型類(Model class)來(lái)解決前面提到的問(wèn)題换帜,我們稱之為 User。在 User 類內(nèi)部鹤啡,我們有:
- 一個(gè)
User.fromJson
構(gòu)造函數(shù), 用于從一個(gè) map 構(gòu)造出一個(gè)User
實(shí)例 map structure - 一個(gè)
toJson
方法, 將User
實(shí)例轉(zhuǎn)化為一個(gè) map.
class User {
String name;
String email;
User({this.name, this.email});
User.fromJson(Map<String, dynamic> json) {
name = json['name'];
email = json['email'];
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = new Map();
data['name'] = this.name;
data['email'] = this.email;
return data;
}
}
采用這種新方法惯驼,我們可以非常容易地反序列化 user.
String jsonStr = '{"name": "John Smith","email": "john@example.com"}';
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<String, dynamic> json) {
return User(name: json['name'], email: json['email']);
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = new Map();
data['name'] = this.name;
data['email'] = this.email;
return data;
}
}
復(fù)雜 JSON 解析
解析對(duì)象中的數(shù)組
{
"url": "xxx",
"tabs": [
{
"labelName":"推薦",
"channelCode":"photo_global"
},
{
"labelName":"拍照",
"channelCode":"tab_photo"
}
]
}
解析:
class TravelModel {
String url;
List<TravelTab> tabs;
TravelModel(this.url, this.tabs);
TravelModel.fromJson(Map<String, dynamic> json) {
url = json['url'];
if (json['tabs'] != null) {
tabs = new List<TravelTab>();
json['tabs'].forEach((i) {
tabs.add(new TravelTab.fromJson(i));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
labelName = json['labelName'];
channelCode = json['channelCode'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['labelName'] = this.labelName;
data['channelCode'] = this.channelCode;
return data;
}
}
修改為 final
class TravelModel {
final String url;
final List<TravelTab> tabs;
TravelModel({this.url, this.tabs});
factory TravelModel.fromJson(Map<String, dynamic> json) {
var tabsJson = json['tabs'] as List;
List<TravelTab> tabs = tabsJson.map((i) => TravelTab.fromJson(i)).toList();
return TravelModel(url: json['url'], tabs: tabs);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
return TravelTab(
labelName: json['labelName'], channelCode: json['channelCode']);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['labelName'] = this.labelName;
data['channelCode'] = this.channelCode;
return data;
}
}
在項(xiàng)目中設(shè)置 json_serializable
在項(xiàng)目中設(shè)置json_serializable---- json_serializable設(shè)置方式