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);
}
有了這個設置,源碼生成器將生成用于序列化name
和email
字段的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)建類時果漾,您會看到與下圖類似的錯誤球切。
這些錯誤是完全正常的,這是因為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命令就可以了。