DartVM服務(wù)器開發(fā)(第二十一天)--Dart中的Gson(jaguar_serializer)

今天我們來學(xué)習(xí)一下如何使用jaguar_serializer包替裆,這里說明一下墓拜,該包在三端平臺都是可用的(Flutter催式,dart web ,dart vm)奴迅,學(xué)習(xí)過安卓的版确,都知道gson吧户誓,該包類似于gson

1.引入包

#pubspec.yaml
dependencies:
  jaguar_serializer: ^2.2.0

dev_dependencies:
  build_runner:
  jaguar_serializer_cli:

執(zhí)行pub get命令

獲取成功.png

導(dǎo)包

import 'package:jaguar_serializer/jaguar_serializer.dart';

2.初始化

  • 新增一個實體類
class Person {
  String name;
  int age;
}
  • 添加生成腳本標記
@GenSerializer()
class PersonSerializer extends Serializer<Person> with _$PersonSerializer {
}
  • 運行腳本
    使用腳本命令pub run build_runner build
    image.png
  • 導(dǎo)入生成代碼
    回到person這個類的文件中梢灭,添加
part 'person.jser.dart';

3.使用

main() async {
  Jaguar(port: 1000)
    ..get('/person', (ctx){
      PersonSerializer personSerializer=new PersonSerializer();
      Person person=new Person()
      ..name='rhyme'
      ..age=18;
 //personSerializer.toMap(person)獲取到map對象
      return Response.json( personSerializer.toMap(person));
    })
    ..log.onRecord.listen(print)
    ..serve(logRequests: true);
}

然后我們來請求一下


image.png

成功返回了json數(shù)據(jù)

4.使用詳解

  • json與對象相互轉(zhuǎn)換

import 'dart:convert';
main(){
  String jsonString='{"name":"rhyme","age":18}';
  PersonSerializer personSerializer=new PersonSerializer();

  // json to entity
  Person person=personSerializer.fromMap(json.decode(jsonString));
  print('name:${person.name} ,age: ${person.age}');

  //entity to json
  String toJson= json.encode( personSerializer.toMap(person));
  print(toJson);
}
  • json 與對象列相互轉(zhuǎn)換

main(){
  String jsonString='[{"name":"rhyme","age":18},{"name":"ben","age":21}]';
  PersonSerializer personSerializer=new PersonSerializer();
  
  // list: json to entity
  //因為目前fromList不支持dynamic的值夷家,所以,我們需要吧json.decode出來的List<dynamic>轉(zhuǎn)化為List<Map>敏释,不然會報異常
  List<Map> mapList=(json.decode(jsonString) as List<dynamic>).map((dy)=>dy as Map).toList();
  List<Person> persons=personSerializer.fromList(mapList);
  for(Person p in persons){
    print('name:${p.name} ,age: ${p.age}');
  }
  //list: entity to json
  String fromJson=json.encode(personSerializer.toList(persons));
  print(fromJson);
}
  • 對象內(nèi)嵌對象與json相互轉(zhuǎn)換

在對象內(nèi)添加一個對象

class Person {
  String name;
  int age;
//new
  Info info;
//new
}

//new
class Info{
   String address;
   String phoneNumber;
}
//edit
@GenSerializer( serializers: [ InfoSerializer])
//edit
class PersonSerializer extends Serializer<Person> with _$PersonSerializer {
}

//new
@GenSerializer()
class InfoSerializer extends Serializer<Info> with _$InfoSerializer {
}
//new 

運行命令pub run build_runner build

image.png

轉(zhuǎn)換跟上面相同

 String jsonString='{"name":"rhyme","age":18,"info":{"address":"廣州","phoneNumber":"159xxxxxxxx"}}';
  PersonSerializer personSerializer=new PersonSerializer();

  // json to entity
  Person person=personSerializer.fromMap(json.decode(jsonString));
  print('name:${person.name} ,age: ${person.age}');

  //entity to json
  String toJson= json.encode(personSerializer.toMap(person));
  print(toJson);
  • 對象內(nèi)嵌對象列

將上面的Info改為List<Info>
重新運行命令pub run build_runner build
轉(zhuǎn)換跟上面一樣

  String jsonString='[{"name":"rhyme","age":18,"info":[{"address":"廣州","phoneNumber":"159xxxxxxxx"},{"address":"北京","phoneNumber":"158xxxxxxxx"}]},{"name":"ben","age":21}]';
  PersonSerializer personSerializer=new PersonSerializer();
  
  // list: json to entity
  //因為目前fromList不支持dynamic的值库快,所以,我們需要吧json.decode出來的List<dynamic>轉(zhuǎn)化為List<Map>钥顽,不然會報異常
  List<Map> mapList=(json.decode(jsonString) as List<dynamic>).map((dy)=>dy as Map).toList();
  List<Person> persons=personSerializer.fromList(mapList);
  for(Person p in persons){
    print('name:${p.name} ,age: ${p.age}');
  }
  //list: entity to json
  String fromJson=json.encode(personSerializer.toList(persons));
  print(fromJson);
  • 對象內(nèi)嵌多個對象

class Person {
  String name;
  int age;
  List<Info> info;
//new
  Avatar avatar;
//new
}


class Info{
   String address;
   String phoneNumber;
}
//new
class Avatar{
  String url;
  String path;

}
//new

//edit
@GenSerializer( serializers: [ InfoSerializer,AvatarSerializer])
//edit
class PersonSerializer extends Serializer<Person> with _$PersonSerializer {
}

@GenSerializer()
class InfoSerializer extends Serializer<Info> with _$InfoSerializer {
}
//new
@GenSerializer()
class AvatarSerializer extends Serializer<Avatar> with _$AvatarSerializer {
}
//new

然后重新運行命令pub run build_runner build
使用也是跟上面相同

  String jsonString='[{"name":"rhyme","age":18,"avatar":{"url":"http://www.baidu.com","path":"baidu"},"info":[{"address":"廣州","phoneNumber":"159xxxxxxxx"},{"address":"北京","phoneNumber":"158xxxxxxxx"}]},{"name":"ben","age":21}]';
  PersonSerializer personSerializer=new PersonSerializer();
  
  // list: json to entity
  //因為目前fromList不支持dynamic的值缺谴,所以,我們需要吧json.decode出來的List<dynamic>轉(zhuǎn)化為List<Map>耳鸯,不然會報異常
  List<Map> mapList=(json.decode(jsonString) as List<dynamic>).map((dy)=>dy as Map).toList();
  List<Person> persons=personSerializer.fromList(mapList);
  for(Person p in persons){
    print('name:${p.name} ,age: ${p.age}');
  }
  //list: entity to json
  String fromJson=json.encode(personSerializer.toList(persons));
  print(fromJson);
  • 別名

有時候湿蛔,我們的實體類成員變量名跟json數(shù)據(jù)中對應(yīng)的字段不相同,可以使用@Alias('')對需要的字段進行標記县爬,里面的值為json對應(yīng)的字段

class Person {
  @Alias('Name')
  String name;
  int age;
  List<Info> info;
  Avatar avatar;
}

要使上面生效阳啥,需要重新運行命令pub run build_runner build

  • Build命令

我們可以發(fā)現(xiàn),當我每次做一個修改财喳,都需要執(zhí)行pub run build_runner build命令察迟,這樣是非常容易導(dǎo)致疏忽的,jaguar_serializer已經(jīng)為我們考慮到了耳高,
我們可以使用命令

pub run build_runner watch

當該命令運行后扎瓶,我們的每次點擊保存,都會重新激活一次腳本泌枪,如下圖


image.png

如果你是Flutter開發(fā)概荷,可以使用下面的build命令

flutter packages pub run build_runner build

Flutter的監(jiān)聽命令

flutter packages pub run build_runner watch

ok,今天就到這里了碌燕,我們明天見!

如果想繼續(xù)學(xué)習(xí)DartVM服務(wù)器開發(fā)误证,請關(guān)注我,學(xué)習(xí)更多騷操作修壕!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愈捅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慈鸠,更是在濱河造成了極大的恐慌蓝谨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異譬巫,居然都是意外死亡咖楣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門缕题,熙熙樓的掌柜王于貴愁眉苦臉地迎上來截歉,“玉大人,你說我怎么就攤上這事烟零”袼桑” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵锨阿,是天一觀的道長宵睦。 經(jīng)常有香客問我,道長墅诡,這世上最難降的妖魔是什么壳嚎? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮末早,結(jié)果婚禮上烟馅,老公的妹妹穿的比我還像新娘。我一直安慰自己然磷,他們只是感情好郑趁,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姿搜,像睡著了一般寡润。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舅柜,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天梭纹,我揣著相機與錄音,去河邊找鬼致份。 笑死变抽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的知举。 我是一名探鬼主播瞬沦,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雇锡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起僚焦,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤锰提,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體立肘,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡边坤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谅年。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茧痒。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖融蹂,靈堂內(nèi)的尸體忽然破棺而出旺订,到底是詐尸還是另有隱情,我是刑警寧澤超燃,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布区拳,位于F島的核電站,受9級特大地震影響意乓,放射性物質(zhì)發(fā)生泄漏樱调。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一届良、第九天 我趴在偏房一處隱蔽的房頂上張望笆凌。 院中可真熱鬧,春花似錦士葫、人聲如沸乞而。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晦闰。三九已至,卻和暖如春鳍怨,著一層夾襖步出監(jiān)牢的瞬間呻右,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工鞋喇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留声滥,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓侦香,卻偏偏與公主長得像落塑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子罐韩,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345