Flutter官方提供的Json轉Dart類的方案須要先手動寫一個Dart model類,而後經過build_runner和json_serializable包提供的相關命令和標註而後再自動生成toJson()
和fromJson
方法,這種方案最大問題在於須要開發者手動寫一個Model類。在一個項目中,咱們須要的Model類可能很是多,若是都須要手動反覆去作的話會很麻煩、無味。爲了解決這個問題,咱們作了一個新的開發工具package Json_model, 使用它,能夠只用一行命令,就能將Json文件轉成Dart 類,咱們不再用手動去寫Dart類。javascript
請參考Github文檔。java
pub run json_model
(Dart VM工程)or flutter packages pub run json_model
(Flutter中) 命令生成Dart model類,生成的文件默認在"lib/models"目錄下Json文件: jsons/user.json
git
{ "name":"wendux", "father":"$user", //能夠經過"$"符號引用其它model類 "friends":"$[]user", // 能夠經過"$[]"來引用數組 "keywords":"$[]String", // 同上 "age":20 }
生成的Dart model類:github
import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; @JsonSerializable() class User { User(); String name; User father; List<User> friends; List<String> keywords; num age; factory User.fromJson(Map<String,dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); }
您也可使用json_annotation包中的「@JsonKey」標註特定的字段。shell
這個功能在特定場景下很是有用,好比Json文件中有一個字段名爲"+1",因爲在轉成Dart類後,字段名會被當作變量名,可是在Dart中變量名不能包含「+」,咱們能夠經過「@JsonKey」來映射變量名;json
{ "@JsonKey(ignore: true) dynamic":"md", "@JsonKey(name: '+1') int": "loved", //將「+1」映射爲「loved」 "name":"wendux", "age":20 }
生成文件以下:數組
import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; @JsonSerializable() class User { User(); @JsonKey(name: '+1') int loved; String name; num age; factory User.fromJson(Map<String,dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); }
測試:工具
import 'models/index.dart'; void main() { var u = User.fromJson({"name": "Jack", "age": 16, "+1": 20}); print(u.loved); // 20 }
關於
@JsonKey
標註的詳細內容請參考
json_annotation 包;
另外,提供了一個@Import
指令,該指令能夠在生成的Dart類中導入指定的文件:開發工具
{ "@import":"test_dir/profile.dart", "@JsonKey(ignore: true) Profile":"profile", "name":"wendux", "age":20 }
生成的Dart類:測試
import 'package:json_annotation/json_annotation.dart'; import 'test_dir/profile.dart'; // 指令生效 part 'user.g.dart'; @JsonSerializable() class User { User(); @JsonKey(ignore: true) Profile profile; //file String name; num age; factory User.fromJson(Map<String,dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); }
更完整的示例請移步這裏 .
默認的源json文件目錄爲根目錄下名爲 "json" 的目錄;能夠經過 src
參數自定義源json文件目錄,例如:
pub run json_model src=json_files
默認的生成目錄爲"lib/models",一樣也能夠經過dist
參數來自定義輸出目錄:
pub run json_model src=json_files dist=data # 輸出目錄爲 lib/data
注意,dist會默認已lib爲根目錄。
若是您正在開發一個工具,想在代碼中使用json_model,此時便不能經過命令行來調用json_model,這是你能夠經過代碼調用:
import 'package:json_model/json_model.dart'; void main() { run(['src=jsons']); //run方法爲json_model暴露的方法; }
也有一些IDE插件提供了Json轉Dart類的功能,它們和Json_model相比:
若是以爲對您有用,歡迎Star,Github Json_model項目地址。