Json-to-Dart-Model

给定一个JSON字符串,该库将生成解析和生成JSON所需的所有Dart类。还设计了遵循Flutter文档建议和Effective Dart: Style的Flutter友好模型类。扩展支持手动序列化JSON和使用Freezed和Json Serializable等代码生成库进行JSON序列化。

注意: 当您使用FreezedJson Serializable时,Json to Dart Model仅生成类型,之后发生的所有事情都由Dart Build System builders负责,负责生成代码。

工作原理

Dart to Json Model Generator将您的JSON对象创建到单独的文件中,因此,如果检测到相似的结构,生成器将把它们创建到不同的文件中,并通过路径(import)合并它们,无论您的对象名称如何。这样,您可以保持代码更清晰,更具可读性。第一个文件名将被重命名,类名将作为前缀添加,以显示对象来自哪个类。如果名称继续重复,将标记为索引以进行无限重命名。

  • 为避免冲突和不必要的结构名称更改,请避免使用基于文件的类名作为JSON键。注意:从文件转换Json to Dart Model将有助于避免这种情况。
  • 名称为奇特名称(如“!breaks”、“|breaks”等)的属性将产生语法错误。

自定义

自定义类非常容易。如果您想快速创建一个简单的类,只需按Enter键继续跳过所有方法。否则,请自己构建。要生成Freezed类和Json Serializable,请选择代码生成。当然,您可以在Settings/Extensions/JSON To Dart Model中设置您的配置。

usage

功能

从剪贴板转换为手动模型类

  • 将您复制的JSON转换为dart模型类。

从选定内容转换为手动模型类

  • 将您选择的JSON转换为dart模型类。

从剪贴板转换为代码生成库支持的模型类

  • 将您复制的JSON转换为代码生成库支持的模型类。转换后将运行一个终端会话以生成其余部分。

从选定内容转换为代码生成库支持的模型类

  • 将您选择的JSON转换为代码生成库支持的模型类。转换后将运行一个终端会话以生成其余部分。

从文件转换

  • 转换文件中的所有JSON对象。

Json to Dart Model生成器将所有JSON对象保存在名为models.jsonc的文件中,并允许您根据偏好配置类。models.jsonc内容是一个列表,其中包含所有将转换为Dart类的JSON对象。jsonc格式允许您注释JSON对象,以便以后轻松找到它们或使其更容易向团队解释。要创建models.jsonc文件,您可以在命令面板中运行命令Build Models或使用键绑定Shift + Ctrl + Alt + B,然后会询问您是否要创建文件,按Enter键添加文件。要配置输出选项,请转到Settings/Extensions/JSON To Dart Model

手动创建文件。只需在应用程序目录my_app/models.jsonc中添加一个新文件,并将所有JSON对象放入由逗号分隔的列表对象中。请注意,您需要为每个对象添加基类名,使用键“__className”:“MyClass”,类名将从对象中删除,并用作代码语法的根类名。不允许重复的类名,以避免覆盖文件。在您的models.jsonc中。通过添加键__path,您可以覆盖默认路径,并在工作区中导航模型到您想要的位置和方式。文件应如下所示:

[
  {
    "__className": "UserPost", // <- The base class name of the object.
    "__path": "/lib/models/user_post", // <- override default path with a new one by adding '__path' key.
    "userId": 1,
    "id": 1, // To mark as required value, change "id" to "r@id".
    "title": "Json To Dart Model", // To mark as a default value, change "title" to "d@title".
    "body": "Json to Dart advanced..."
  }
]

添加对象并转换为Dart类后,只需从命令面板运行命令,或更简单地使用键绑定Shift + Ctrl + Alt + B。如果您想更新某个类,只需删除目录中的类文件夹,然后再次运行Build ModelsJson to Dart Model将生成缺失的目录。

增强的文件名

增强的文件名,如user.model.dart,可以使您的代码与其他转换器(如Hive Object Converter)兼容。要创建它,您只需用点分隔类名,然后点之后的所有内容都将作为增强名称添加。示例:user.model结果为user.model.dart。仅此而已。

上下文操作

通过右键菜单转换JSON。

  • 选择任何文件夹并运行可用方法开始转换。
  • 选择文件**.json**.jsonc中的JSON代码,右键单击,然后运行可用方法开始转换。
  • 右键单击models.jsonc文件,然后运行可用方法开始转换。

注解

可以将JSON值标记为默认值或必填值。您所需要做的就是将d@r@添加到JSON键中,Json to Dart Model将为您生成它们。

  • d@ - 标记为默认值。
  • r@ - 标记为必填值。
{
  "r@id": 1,
  "d@title": "Json To Dart Model"
}

结果

class Example {
  int id;
  String title;

  Example({@required this.id, this.title = 'Json To Dart Model'});
  
  // The rest...
}

这也适用于Freezed和JSON Serializable,如果标记为默认值,还会初始化非常量值,如DateTime

注意:如果我使用多个注解“r@d@key”会怎样?那么生成器将优先使用默认值并生成默认值,因为只有没有默认值的命名参数才能是必填的。

加速转换

如果您经常处理JSON文件,并且厌倦了每次都在命令面板中自定义模型。那么您可以转到Settings/Extensions/JSON To Dart Model并将主配置设置为true。Json to Dart Model将在所有地方使用设置配置,并且永远不会询问您的输入。只需从选定内容或剪贴板中选择任何命令,然后选择目录。将快速模式设置为true以更快地转换为默认目录。

JSON Serializable

将使用代码生成库进行JSON序列化添加到pubspec.yaml

pubspec.yaml结构

dependencies:
  # Your other regular dependencies here
  json_annotation: <latest_version>

dev_dependencies:
  # Your other dev_dependencies here
  build_runner: <latest_version>
  json_serializable: <latest_version>

Freezed

Freezed支持旧版本(最高0.12.7)和新版本(0.14.0及更高版本)。Freezed需要三个包才能通过几次点击将JSON文件生成为Freezed类。

pubspec.yaml结构

 dependencies:
   # Your other regular dependencies here
   freezed_annotation: <latest_version>

 dev_dependencies:
   # Your other dev_dependencies here
   build_runner: <latest_version>
   freezed: <latest_version>

阅读更多关于如何安装Freezed

所有使用Freezed生成的类都将是@immutable,并支持所有方法,如copyWithtoString、相等运算符==……请参见示例。

@freezed
class Todo with _$Todo {
  factory Todo({
    @JsonKey(name: 'todo_id') int? todoId,
    String? description,
    bool? completed,
  }) = _Todo;

  factory Todo.fromJson(Map<String, dynamic> json) => _$TodoFromJson(json);
}

Freezed生成器对于日常编码的人来说非常有用。您所要做的就是更新一些值,Freezed将负责其余部分。您不必担心忘记更新某个方法的解析器。您还可以通过Freezed执行更多操作,请阅读Freezed文档

提示:如果您认为生成的文件的数量太多,可以参考Freezed的提示,了解如何忽略生成文件的lint警告

Equatable

Equatable是一个不可变类,能够以更好的方式比较生成的模型。您可以检查两个不同的实例类是否相等,而无需一行额外代码。当然,您可以添加toString方法和copyWith以获得更好的体验。

class Todo extends Equatable {
  final int? id;
  final String? description;
  final bool? completed;

  const Todo({this.id, this.description, this.completed});

  factory Todo.fromJson(Map<String, dynamic> json) => Todo(
        id: json['id'] as int?,
        description: json['description'] as String?,
        completed: json['completed'] as bool?,
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'description': description,
        'completed': completed,
      };

  // Here will be more methods after your customization.
  // toString();
  // copyWith();

  @override
  List<Object?> get props => [id, description, completed];
}

要添加Equatable支持,您只需在JSON到代码的解析过程开始时选择Equatable相等支持,扩展程序将负责在Dart模型中设置高级代码相等检查。

相等运算符

如果您不想安装Equatable包并使用@immutable类和值,那么您可以添加相等运算符并自定义类为可变。

@override
bool operator ==(Object other) {
  if(identical(other, this)) return true;
  return other is Todos &&
    other.userId == userId &&
    other.id == id &&
    other.title == title &&
    other.completed == completed;
}

@override
int get hashCode => userId.hashCode ^ id.hashCode ^ title.hashCode ^ completed.hashCode;

To String方法

您可以在类中添加toString方法以改善调试体验。

@override
String toString() {
  return 'Todos(userId: $userId, id: $id, title: $title, completed: $completed)';
}

Equatable可以实现toString方法,包括所有给定的props。如果您想要这种行为,只需在JSON到代码的解析过程开始时选择Stringify方法。

@override
bool get stringify => true;

CopyWith方法

copyWith方法将使您在@immutable类方面的工作更加轻松。强烈推荐与不可变类一起使用。

Todo copyWith({
  int? id,
  String? description,
  bool? completed,
}) {
  return Todo(
    id: id ?? this.id,
    description: description ?? this.description,
    completed: completed ?? this.completed,
  );
}

空安全

Null-Safety默认启用,就像在Dart语言中一样,它将指示一个变量可能具有null值。要禁用它,请转到Settings/Extensions/JSON To Dart Model

注意:确保您的包也支持Dart空安全。

使用代码生成库序列化JSON

如果您想使用Flutter的代码生成库,首先,我建议您将依赖项添加到pubspec.yaml文件中。也可以通过此扩展完成。您无需担心:wink:之后,您可以将JSON转换为模型类。然后,您需要运行flutter pub run build_runner build命令来根据Flutter文档生成模型缺失的代码。幸运的是,扩展程序会自动打开一个新的终端会话并运行该命令,ye(笑)。

使用方法

  1. 选择一个有效的JSON。按Ctrl + shift + P(Linux和Mac)或Ctrl + P(Windows)并搜索Convert From SelectionConvert From Selection To Code Generation Supported Classes。提供一个基类名和保存位置。

  2. 复制一个有效的JSON。按Ctrl + shift + P(Linux和Mac)或Ctrl + P(Windows)并搜索Convert From ClipboardConvert From Clipboard To Code Generation Supported Classes。提供一个基类名和保存位置。

  3. Ctrl + shift + P(Linux和Mac)或Ctrl + P(Windows)并搜索Add Code Generation Libraries To pubspec.yaml,然后按Enter键。

  4. Ctrl + shift + P(Linux和Mac)或Ctrl + P(Windows)并搜索Build Models,然后按Enter键。

  5. 使用快捷键。

  6. 从右键菜单转换。

键绑定

从剪贴板转换(Shift + Ctrl + Alt + V

从选定内容转换(Shift + Ctrl + Alt + S

从文件转换(Shift + Ctrl + Alt + B

从剪贴板转换为代码生成支持的类(Shift + Ctrl + Alt + G

从选定内容转换为代码生成支持的类(Shift + Ctrl + Alt + H

转换器

  • 数组类型合并
  • 重复类型预防
  • 联合类型
  • 可选类型
  • 数组类型

已知问题

  1. Linux上使用键绑定可能会引发错误Command failed: xclip -selection clipboard -o,当Linux缺少剪贴板包时会发生这种情况。要解决此错误,请在终端中运行此命令以安装缺少的包。

    sudo apt-get install xclip
    
  2. 匹配错误的类型。根据我的经验,一些API提供者会写入integer值而不是double,例如,1或1.00而不是1.10。问题在于,此生成器会进行深度对象扫描,并读取每个项以检测值的类型,并返回找到的类型。但是列表工作得很好,如果列表只包含doubleintegers,列表类型将返回为num。如果您自己编写JSON对象,请尝试提供正确的值类型以获得更好的结果。这都与JSON质量有关:sunglasses

GitHub

https://github.com/hiranthaR/Json-to-Dart-Model