一行命令,將 JSON 文件轉成 Dart 類

Flutter官方提供的Json轉Dart類的方案須要先手動寫一個Dart model類,而後經過build_runner和json_serializable包提供的相關命令和標註而後再自動生成toJson()fromJson方法,這種方案最大問題在於須要開發者手動寫一個Model類。在一個項目中,咱們須要的Model類可能很是多,若是都須要手動反覆去作的話會很麻煩、無味。爲了解決這個問題,咱們作了一個新的開發工具package Json_model使用它,能夠只用一行命令,就能將Json文件轉成Dart 類,咱們不再用手動去寫Dart類。javascript

安裝

請參考Github文檔java

使用

  1. 在工程根目錄下建立一個名爲 "jsons" 的目錄;
  2. 建立或拷貝Json文件到"jsons" 目錄中 ;
  3. 運行 pub run json_model (Dart VM工程)or flutter packages pub run json_model(Flutter中) 命令生成Dart model類,生成的文件默認在"lib/models"目錄下

例子

Json文件: jsons/user.jsongit

{
  "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);
}

複製代碼

@JsonKey

您也可使用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

另外,提供了一個@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相比:

  1. Json_model須要單獨維護一個存放Json文件的文件夾,若是有改動,只需修改Json文件即可從新生成Model類;而IDE插件通常須要用戶手動將Json內容拷貝複製到一個輸入框中,這樣生成以後Json文件沒有存檔的化,以後要改動就須要手動。
  2. Json_model能夠手動指定某個字段引用的其它Model類,能夠避免生成重複的類;而IDE插件通常會爲每個Json文件中全部嵌套對象都單獨生成一個Model類,即便這些嵌套對象可能在其它Model類中已經生成過。
  3. Json_model 提供了命令行轉化方式,能夠方便集成到CI等非UI環境的場景。

最後

若是以爲對您有用,歡迎Star,Github Json_model項目地址

相關文章
相關標籤/搜索