無需手寫,自動生成Flutter/Dart實體類檔案

zhouweixian發表於2019-01-09

json2entity

一個自動生成Flutter/Dart實體類(原始檔)的工具

初次發文,請多多包涵。

在Java開發中,JSON字串轉實體類,有很多工具,我最常用IDEA的Gsonformat外掛,把JSON字串貼上到文字框,點選生成,一個Java Bean就寫好了。 json2entity,就是Dart和Flutter開發的Gsonformat。

最簡用法

$ j2e -j '{"result":1,"msg":"ok"}'
複製程式碼

terminal輸出:

$ j2e -j '{"result":1,"msg":"ok"}'
class Model {
 num result;
 String msg;
 Model({
  this.result,
  this.msg
 });

 Model.fromJson(Map < String, dynamic > json):
  result=json['result'],
  msg=json['msg'];
 Map <String, dynamic> toJson() => {
  'result':result,
  'msg':msg
 };
}%
複製程式碼

怎麼樣是不是很簡單?

BUT!!! j2e是什麼,j2e在哪裡 ?

j2e 只是json2entity 的別名,使用json2entityj2e, 是等價的。 json2entity是一個Dart package,下面是安裝方法。

使用前準備

最多隻需3步:

  1. pubspec.yaml中引入
dev_dependencies:
  json2entity: 1.0.6
複製程式碼
  1. 啟用:
$ pub global activate json2entity
複製程式碼
  1. 確保"$HOME/.pub-cache/bin"已新增到你的PATH變數中。如果已新增,可以跳過此步。

設定完成後,在你的terminal中輸入j2e或者json2entity,然後回車,看看效果吧:

$ j2e
No input args found
Usage:
        -j, --json                              Input json string
        -f, --file                              Input json from file
        -o, --output                            Input output file path and name
        -v, --[no-]verbose                      Show verbose
        -s, --[no-]json-serializable-support    Indicates whether json-serializable is supported
        -h, --[no-]help                         Help%
複製程式碼

如果輸出如上所示,則已經成功了,在terminal的任何路徑,你都可以愉快地使用了。

高階用法

輸出到檔案

沒有指定輸出,預設輸出到終端。

如果想輸出到檔案,可以使用-o選項, 使用重定向輸出到檔案也可以。使用-o,後面的引數會作為檔名和類名:

j2e -j '{"result":1,"msg":"ok"}' -o lib/model/BaseModel

$ j2e -j '{"result":1,"msg":"ok"}' -o lib/model/BaseModel
$ cat lib/model/base_model.dart
class BaseModel {
 num result;
 String msg;
 BaseModel({
  this.result,
  this.msg
 });

 BaseModel.fromJson(Map < String, dynamic > json):
  result=json['result'],
  msg=json['msg'];
 Map <String, dynamic> toJson() => {
  'result':result,
  'msg':msg
 };
}
複製程式碼

注意,例如這裡BaseModel,使用了駝峰格式,這樣,對應實體類檔名會轉為下劃線法:base_model.dart

支援json_serializable

如果你使用了json_serializable. 也是可以的:只需要多一個-s

$ j2e -j '{"result":1,"msg":"ok"}' -s                           # 輸出到stdout
$ j2e -j '{"result":1,"msg":"ok"}' -o lib/model/BaseModel -s    # 輸出到檔案: ./lib/base_model.dart
複製程式碼

當然,這種情況下,生成的只是部分程式碼,對應的.g.dart檔案,還需要你手動的執行一下build_runner:

$ flutter packages pub run build_runner build
複製程式碼

從檔案讀取輸入

通過-j從命令列讀取輸入,每次只能讀取一條JSON。如果不能滿足你的需求,你可以使用-f,從檔案批量讀取並轉換。 輸入檔案的格式,必須是格式良好的JSON字串,格式如下:

//input.json
{
    “BaseModel": "{\"result\":1,\"msg\":\"ok\"}",
    "AnswerModel": "{\"result\":1,\"msg\":\"ok\",\"data\":{\"answer\":\"A\"}}"
}
複製程式碼

-f指定輸入檔案,-o輸出目錄,命令如下:

$ j2e -f input.json -o lib/model
$ j2e -f input.json -o lib/model -s
複製程式碼

其他

生成的實體類,有時候可能還需要一些修改。

例如,生成的實體類,屬性名和JSON裡的key保持一致。如果key是下劃線命名法,你需要的事駝峰命名法,你可能需要手動修改一下。 如果你使用了json_serializable,可以使用@JsonKey標註,例如:

@JsonKey(name: 'registration_date_millis')
final int registrationDateMillis;
複製程式碼

另外,工具只提供了簡單的縮排,並不保證縮排完美。可以在生成後使用dartfmt自行格式化:

dartfmt -w <dart-code-path>
複製程式碼

或者使用IDE格式化程式碼。

對於一個工具來說,上面這些已經滿足大部分需求了。本來打算寫一個IDEA plugin,使用vscode後,就放棄了。而且使用terminal更高大上是不是?

更多示例,請前往我的Github

json2entity使用Dart語言實現,已釋出到 Pub | Dart | json2entity

相關文章