無需手寫,自動生成Flutter/Dart實體類文件

json2entity

一個自動生成Flutter/Dart實體類(源文件)的工具

初次發文,請多多包涵。git

在Java開發中,JSON字符串轉實體類,有不少工具,我最經常使用IDEA的Gsonformat插件,把JSON字符串粘貼到文本框,點擊生成,一個Java Bean就寫好了。 json2entity,就是Dart和Flutter開發的Gsonformat。github

最簡用法

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

terminal輸出:shell

$ 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
 };
}%
複製代碼

怎麼樣是否是很簡單?json

BUT!!! j2e是什麼,j2e在哪裏 ?bash

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

使用前準備

最多隻需3步:ui

  1. pubspec.yaml中引入
dev_dependencies:
 json2entity: 1.0.6
複製代碼
  1. 激活:
$ pub global activate json2entity
複製代碼
  1. 確保"$HOME/.pub-cache/bin"已添加到你的PATH變量中。若是已添加,能夠跳過此步。

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

$ 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的任何路徑,你均可以愉快地使用了。spa

高級用法

輸出到文件

沒有指定輸出,默認輸出到終端。插件

若是想輸出到文件,可使用-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

相關文章
相關標籤/搜索