无需手写,自动生成Flutter/Dart实体类文件

idea (77) 2023-03-25 08:03

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说无需手写,自动生成Flutter/Dart实体类文件,希望能够帮助你!!!。

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.1.2
  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

或者:

$ flutter packages pub run build_runner watch

从文件读取输入

通过-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

小写驼峰字段支持

如果key是下划线命名法,希望实体类字段是驼峰命名法,怎么办? 如果你使用了json_serializable,可以使用@JsonKey标注,例如:

@JsonKey(name: 'registration_date_millis')
final int registrationDateMillis;

版本1.1.0+已经支持自动完成@JsonKey的添加,只需在-s的基础上,增加一个-c选项:

$ j2e -j '{"result":1,"error_msg":"ok"}' -sc
import 'package:json_annotation/json_annotation.dart';
part 'model.g.dart';

@JsonSerializable()
class Model {
  num result;
  @JsonKey(name: 'error_msg')
  String errorMsg;
  Model({
    this.result,
    this.errorMsg
  });

  factory Model.fromJson(Map<String, dynamic> json) => _$ModelFromJson(json);
  Map<String, dynamic> toJson() => _$ModelToJson(this);
}

另外:项目也提供了单独工具camelize,将现有的dart实体类含有下划线的字段,自动转小写驼峰风格,并添加@JsonKey。

camelize <dart_file_path>

其他

工具只提供了简单的缩进,并不保证缩进完美。可以在生成后使用dartfmt自行格式化:

dartfmt -w <dart-code-path>

或者使用IDE格式化代码。

对于一个工具来说,上面这些已经满足大部分需求了。本来打算写一个IDEA plugin,使用vscode后,就放弃了。而且使用terminal更高大上是不是?

更多示例,请前往我的Github。

json2entity使用Dart语言实现,已发布到 Pub | Dart | json2entity。

发表回复