Flutter網(wǎng)絡(luò)數(shù)據(jù)處理-json序列化

前言

網(wǎng)絡(luò)請(qǐng)求返回的數(shù)據(jù)揩懒,為了方便快捷地在UI上的控件上調(diào)用并展示,一般我們都會(huì)定義一個(gè)模型類來(lái)填充網(wǎng)絡(luò)請(qǐng)求返回的json數(shù)據(jù)挽封,用類對(duì)象的屬性調(diào)用的方式已球,即可以防止在運(yùn)行過程中出現(xiàn)不可預(yù)知的錯(cuò)誤,又可以快捷地知道某個(gè)控件上需要顯示哪個(gè)數(shù)據(jù)辅愿,所以將json數(shù)據(jù)轉(zhuǎn)為model類可以更好地提升我們的開發(fā)效率智亮。

眾所周知,若我們手動(dòng)去序列化json數(shù)據(jù)点待,那將是一個(gè)很痛苦的過程阔蛉,這樣反而增加了工作量,得不償失癞埠。幸好状原,F(xiàn)lutter也提供了自動(dòng)序列化的三方庫(kù):json_serializable

步驟

廢話不多說,直接上配置步驟:

1苗踪、在pubspec.yaml中添加

dependencies:
  json_annotation: ^2.0.0

dev_dependencies:
  build_runner: ^1.0.0
  json_serializable: ^2.0.0

保存或者終端運(yùn)行flutter packages get颠区,項(xiàng)目中就會(huì)添加以上依賴。

2通铲、新建一個(gè)model類毕莱,如user.dart,以下每個(gè)步驟都是需要我們手動(dòng)輸入的

// 1、引入json_annotation.dart
import 'package:json_annotation/json_annotation.dart';

// 2朋截、這里手動(dòng)輸入:user.g.dart文件將在我們運(yùn)行生成命令后自動(dòng)生成
part 'user.g.dart';

// 3蛹稍、這個(gè)標(biāo)注是告訴生成器,這個(gè)類是需要生成Model類的
@JsonSerializable()

class User{
  // 4质和、定義網(wǎng)絡(luò)數(shù)據(jù)json返回屬性值
  String? name;
  String? email;

  // 5稳摄、必須的方法
  User(this.name, this.email);

  // 6、必須的代碼:代碼格式是固定的饲宿,將下面的“User”關(guān)鍵詞替換為你定義的model類名稱即可
 // 反序列化
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
 // 序列化
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

3厦酬、如果想要用自定義的屬性名稱,不想用服務(wù)端返回的屬性名稱

@JsonKey(name: 'user_id')
final int userId;

4瘫想、如果有些字段不想去解析仗阅,可以這樣

@JsonKey(ignore: true)
  int? age; 

5、打開終端国夜,在項(xiàng)目根目錄下運(yùn)行:

一次性生成:

flutter packages pub run build_runner build

自動(dòng)監(jiān)控生成:

flutter packages pub run build_runner watch

以上步驟都操作完后减噪,在model類同級(jí)目錄下就會(huì)生成對(duì)應(yīng)的model.g.dart文件;接下來(lái)就可以使用創(chuàng)建好的模型類了车吹。

效果

1筹裕、完整代碼:

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()

class User{
  String? name;
  String? email;

  @JsonKey(name: 'user_id')
  int? userId;
  @JsonKey(ignore: true)
  int? age; 

  User(this.name, this.email, this.userId);

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

2、運(yùn)行完flutter packages pub run build_runner build后

截屏2021-07-13 下午11.06.53.png

終端打印以上代碼窄驹,表示model.g.dart文件已經(jīng)生成成功了朝卒。

若報(bào)錯(cuò):
Conflicting outputs were detected and the build is unable to prompt for permission to remove them. These outputs must be removed manually or the build can be run with --delete-conflicting-outputs. The outputs are: lib/model/user.g.dart

應(yīng)該是本地已經(jīng)存在user.g.dart文件,需要清除乐埠。

解決方案:
運(yùn)行以下兩個(gè)命令:

flutter packages pub run build_runner clean
flutter packages pub run build_runner build --delete-conflicting-outputs

3抗斤、運(yùn)行完flutter packages pub run build_runner watch后

截屏2021-07-13 下午11.14.56.png

若終端打印以上代碼,表示實(shí)時(shí)監(jiān)控已打開丈咐,只要修改了model類的屬性并保存瑞眼,model.g.dart文件里的代碼也會(huì)自動(dòng)生成。

需要注意的是棵逊,打開了watch伤疙,可能會(huì)影響hot load,若已經(jīng)生成了model.g.dart文件辆影,建議關(guān)閉watch掩浙,下次修改時(shí)再次打開即可。

結(jié)語(yǔ)

好了秸歧,網(wǎng)絡(luò)json數(shù)據(jù)序列化就到這里了,有問題的可以留言或私信我衅澈,對(duì)你有幫助的話键菱,也可以點(diǎn)個(gè)贊哦!

參考文檔

https://flutterchina.club/json/
https://www.codercto.com/a/89377.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市经备,隨后出現(xiàn)的幾起案子拭抬,更是在濱河造成了極大的恐慌,老刑警劉巖侵蒙,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件造虎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡纷闺,警方通過查閱死者的電腦和手機(jī)算凿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)犁功,“玉大人氓轰,你說我怎么就攤上這事〗裕” “怎么了署鸡?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)限嫌。 經(jīng)常有香客問我靴庆,道長(zhǎng),這世上最難降的妖魔是什么怒医? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任炉抒,我火速辦了婚禮,結(jié)果婚禮上裆熙,老公的妹妹穿的比我還像新娘端礼。我一直安慰自己,他們只是感情好入录,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布蛤奥。 她就那樣靜靜地躺著,像睡著了一般僚稿。 火紅的嫁衣襯著肌膚如雪凡桥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天蚀同,我揣著相機(jī)與錄音缅刽,去河邊找鬼。 笑死蠢络,一個(gè)胖子當(dāng)著我的面吹牛衰猛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刹孔,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼啡省,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起卦睹,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤畦戒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后结序,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體障斋,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年徐鹤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垃环。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凳干,死狀恐怖晴裹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情救赐,我是刑警寧澤涧团,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站经磅,受9級(jí)特大地震影響泌绣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜预厌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一阿迈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轧叽,春花似錦苗沧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至网严,卻和暖如春识樱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背震束。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工怜庸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垢村。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓割疾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嘉栓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杈曲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容