Flutter(Dart)中JSON轉(zhuǎn)對象

2021年4月編輯補充

參考:https://flutterchina.club/json/#code-generation JSON和序列化

使用代碼生成庫序列化JSON

盡管還有其他庫可用妹蔽,但在本教程中谣旁,我們使用了json_serializable package包裙品。 它是一個自動化的源代碼生成器脯燃,可以為我們生成JSON序列化模板。

由于序列化代碼不再由我們手寫和維護躲胳,我們將運行時產(chǎn)生JSON序列化異常的風險降至最低上沐。

在項目中設置json_serializable

要包含json_serializable到我們的項目中,我們需要一個常規(guī)和兩個開發(fā)依賴項东臀。簡而言之着饥,開發(fā)依賴項是不包含在我們的應用程序源代碼中的依賴項。

通過此鏈接可以查看這些所需依賴項的最新版本 惰赋。

pubspec.yaml

dependencies:
  # Your other regular dependencies here
  json_annotation: ^2.0.0

dev_dependencies:
  # Your other dev_dependencies here
  build_runner: ^1.0.0
  json_serializable: ^2.0.0

在您的項目根文件夾中運行 flutter packages get (或者在編輯器中點擊 “Packages Get”) 以在項目中使用這些新的依賴項.

以json_serializable的方式創(chuàng)建model類

讓我們看看如何將我們的User類轉(zhuǎn)換為一個json_serializable宰掉。為了簡單起見,我們使用前面示例中的簡化JSON model赁濒。

user.dart

import 'package:json_annotation/json_annotation.dart';

// user.g.dart 將在我們運行生成命令后自動生成
part 'user.g.dart';

///這個標注是告訴生成器轨奄,這個類是需要生成Model類的
@JsonSerializable()

class User{
  User(this.name, this.email);

  String name;
  String email;
  //不同的類使用不同的mixin即可
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

有了這個設置,源碼生成器將生成用于序列化nameemail字段的JSON代碼拒炎。

如果需要挪拟,自定義命名策略也很容易。例如击你,如果我們正在使用的API返回帶有snake_case的對象玉组,但我們想在我們的模型中使用lowerCamelCase, 那么我們可以使用@JsonKey標注:

/// Tell json_serializable that "registration_date_millis" should be
/// mapped to this property.
@JsonKey(name: 'registration_date_millis')
final int registrationDateMillis;

運行代碼生成程序

json_serializable第一次創(chuàng)建類時果漾,您會看到與下圖類似的錯誤球切。

IDE warning when the generated code for a model class does not exist yet.

這些錯誤是完全正常的,這是因為model類的生成代碼還不存在绒障。為了解決這個問題吨凑,我們必須運行代碼生成器來為我們生成序列化模板。

There are two ways of running the code generator. 有兩種運行代碼生成器的方法:

一次性生成

通過在我們的項目根目錄下運行flutter packages pub run build_runner build户辱,我們可以在需要時為我們的model生成json序列化代碼鸵钝。 這觸發(fā)了一次性構建,它通過我們的源文件庐镐,挑選相關的并為它們生成必要的序列化代碼恩商。

雖然這非常方便,但如果我們不需要每次在model類中進行更改時都要手動運行構建命令的話會更好必逆。

持續(xù)生成

使用watcher可以使我們的源代碼生成的過程更加方便怠堪。它會監(jiān)視我們項目中文件的變化揽乱,并在需要時自動構建必要的文件。我們可以通過flutter packages pub run build_runner watch在項目根目錄下運行來啟動watcher粟矿。

只需啟動一次觀察器凰棉,然后并讓它在后臺運行,這是安全的陌粹。

使用json_serializable模型

要通過json_serializable方式反序列化JSON字符串撒犀,我們不需要對先前的代碼進行任何更改。

Map userMap = JSON.decode(json);
var user = new User.fromJson(userMap);

序列化也一樣掏秩。調(diào)用API與之前相同或舞。

String json = JSON.encode(user);

有了json_serializable,我們可以在User類上忘記任何手動的JSON序列化 蒙幻。源代碼生成器創(chuàng)建一個名為user.g.dart的文件映凳,它具有所有必需的序列化邏輯。 現(xiàn)在杆煞,我們不必編寫自動化測試來確保序列化的正常工作 - 這個庫會確保序列化工作正常魏宽。

-------------------------------- 不華麗的分割線 --------------------------------
下面的方法過時了

下面介紹兩種方法:
一、使用在線工具决乎,生成再拷貝
https://javiercbk.github.io/json_to_dart/
這個很簡單,就不多說了派桩。

二构诚、使用freezed
https://pub.dev/packages/freezed
最好再結合VSCode的插件 Freezed (我使用VSCode)AndroidStudio上也有類似的插件。

安裝:pubspec.yaml中修改如下

dependencies:
  flutter:
    sdk: flutter
  freezed_annotation:

dev_dependencies:
  flutter_test:
    sdk: flutter
  json_serializable:
  build_runner:
  freezed:

安裝好Freezed插件后

方法:打開命令面板 輸入 Freezed


命令面板

選擇命令: Freezed:Generate a new Freezed class

依次輸入類名铆惑、是否序列化(Y)
修改相應的名稱范嘱,再加入屬性,這里可以選擇從JSON中拷貝生成员魏。

再從命令面板中丑蛤,操作同上 執(zhí)行
Freezed:Build with build_runner

執(zhí)行結束后,就OK了撕阎。
下次再修改了 item.dart 文件后受裹,再次執(zhí)行 build_runner命令就可以了。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虏束,一起剝皮案震驚了整個濱河市棉饶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镇匀,老刑警劉巖照藻,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汗侵,居然都是意外死亡幸缕,警方通過查閱死者的電腦和手機群发,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來发乔,“玉大人熟妓,你說我怎么就攤上這事×辛疲” “怎么了滑蚯?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抵栈。 經(jīng)常有香客問我告材,道長,這世上最難降的妖魔是什么古劲? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任斥赋,我火速辦了婚禮,結果婚禮上产艾,老公的妹妹穿的比我還像新娘疤剑。我一直安慰自己,他們只是感情好闷堡,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布隘膘。 她就那樣靜靜地躺著,像睡著了一般杠览。 火紅的嫁衣襯著肌膚如雪弯菊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天踱阿,我揣著相機與錄音管钳,去河邊找鬼。 笑死软舌,一個胖子當著我的面吹牛才漆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播佛点,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼醇滥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恋脚?” 一聲冷哼從身側響起腺办,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糟描,沒想到半個月后怀喉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡船响,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年躬拢,在試婚紗的時候發(fā)現(xiàn)自己被綠了躲履。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡聊闯,死狀恐怖工猜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菱蔬,我是刑警寧澤篷帅,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拴泌,受9級特大地震影響魏身,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚪腐,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一箭昵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧回季,春花似錦家制、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鼻忠,卻和暖如春诅病,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粥烁。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝇棉,地道東北人讨阻。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像篡殷,于是被迫代替她去往敵國和親钝吮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

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