序列化方式
- 手動(dòng)序列化和反序列化
- 通過代碼生成自動(dòng)序列化和反序列化
對(duì)于較小項(xiàng)目,使用代碼生成器可能會(huì)過度堂鲤。對(duì)于具有多個(gè)JSON model的復(fù)雜應(yīng)用程序锤窑,手動(dòng)序列化可能會(huì)比較重復(fù)甚淡,并會(huì)很容易出錯(cuò)演怎。
①小項(xiàng)目手動(dòng)序列化
- 使用
dart:convert
中內(nèi)置的JSON解碼器 - 將原始JSON字符串傳遞給
JSON.decode()
方法匕争,然后在返回的Map<String, dynamic>
中查找所需的值 - 有外部依賴或其它的設(shè)置
②大中型項(xiàng)目中使用代碼生成
- 通過外部庫為您自動(dòng)生成序列化模板
- 它需要一些初始設(shè)置,并運(yùn)行一個(gè)文件觀察器爷耀,從您的model類生成代碼
使用代碼生成序列化JSON
借助:json_serializable
和 build_runner
甘桑、json_annotation
庫實(shí)現(xiàn)
①添加依賴
dependencies:
flutter:
sdk: flutter
# json生成
json_annotation: ^2.2.0
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^1.3.0
json_serializable: ^2.2.0
②創(chuàng)建model類
JSON 實(shí)例
{
"list1": [
{
"XMMC": "晶澤·云璽(一期)",
"XMDZ": "南湖生態(tài)城B-05地塊",
"PIC": "../../images/xmimg/b72c1ecd-2f0b-46a0-b226-2440817e9f4d-20180607093242.jpg"
}
]
}
- 復(fù)雜的格式可能會(huì)有問題,需要自己斟酌
import 'package:json_annotation/json_annotation.dart';
part 'newhouse.g.dart';
@JsonSerializable()
class newhouse extends Object {
@JsonKey(name: 'list1')
List<List1> list1;
newhouse(this.list1,);
factory newhouse.fromJson(Map<String, dynamic> srcJson) => _$newhouseFromJson(srcJson);
Map<String, dynamic> toJson() => _$newhouseToJson(this);
}
@JsonSerializable()
class List1 extends Object {
@JsonKey(name: 'XMMC')
String xMMC;
@JsonKey(name: 'XMDZ')
String xMDZ;
@JsonKey(name: 'PIC')
String pIC;
List1(this.xMMC,this.xMDZ,this.pIC,);
factory List1.fromJson(Map<String, dynamic> srcJson) => _$List1FromJson(srcJson);
Map<String, dynamic> toJson() => _$List1ToJson(this);
}
③生成序列化模板
3.1一次性生成
- 根目錄下運(yùn)行
flutter packages run build_runner build --delete-conflicting-outputs
歹叮,我們可以在需要時(shí)為我們的model生成json序列化代碼 - 雖然這非常方便跑杭,但如果不需要每次在model類中進(jìn)行更改時(shí)都要手動(dòng)運(yùn)行構(gòu)建命令會(huì)更好
3.2持續(xù)生成
- 使用watcher可以使我們的源代碼生成的過程更加方便。它會(huì)監(jiān)視我們項(xiàng)目中文件的變化咆耿,并在需要時(shí)自動(dòng)構(gòu)建必要的文件
- 通過
flutter packages pub run build_runner
watch在項(xiàng)目根目錄下運(yùn)行來啟動(dòng)watcher - 只需啟動(dòng)一次觀察器德谅,然后并讓它在后臺(tái)運(yùn)行
④使用json_serializable
模型
- 反序列化(decode)
Map houseMap = json.decode(json);
var house = new newhouse.fromJson(houseMap);
- 序列化(encode)
String json = JSON.encode(house );