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
的別名,使用json2entity
和 j2e
, 是等價的。
json2entity是一個Dart package,下面是安裝方法。
使用前準備
最多隻需3步:
- pubspec.yaml中引入
dev_dependencies:
json2entity: 1.0.6
複製程式碼
- 啟用:
$ pub global activate json2entity
複製程式碼
- 確保
"$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。