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更高大上是不是?