Json-to-Dart-Model
给定一个JSON字符串,该库将生成解析和生成JSON所需的所有Dart类。还设计了遵循Flutter文档建议和Effective Dart: Style的Flutter友好模型类。扩展支持手动序列化JSON和使用Freezed和Json Serializable等代码生成库进行JSON序列化。
注意: 当您使用
Freezed或Json 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中设置您的配置。

功能
从剪贴板转换为手动模型类
- 将您复制的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 Models,Json 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,并支持所有方法,如copyWith、toString、相等运算符==……请参见示例。
@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(笑)。
- 阅读更多关于flutter文档建议关于JSON和序列化。
使用方法
-
选择一个有效的JSON。按
Ctrl + shift + P(Linux和Mac)或Ctrl + P(Windows)并搜索Convert From Selection或Convert From Selection To Code Generation Supported Classes。提供一个基类名和保存位置。 -
复制一个有效的JSON。按
Ctrl + shift + P(Linux和Mac)或Ctrl + P(Windows)并搜索Convert From Clipboard或Convert From Clipboard To Code Generation Supported Classes。提供一个基类名和保存位置。 -
按
Ctrl + shift + P(Linux和Mac)或Ctrl + P(Windows)并搜索Add Code Generation Libraries To pubspec.yaml,然后按Enter键。 -
按
Ctrl + shift + P(Linux和Mac)或Ctrl + P(Windows)并搜索Build Models,然后按Enter键。 -
使用快捷键。
-
从右键菜单转换。
键绑定
从剪贴板转换(Shift + Ctrl + Alt + V)
从选定内容转换(Shift + Ctrl + Alt + S)
从文件转换(Shift + Ctrl + Alt + B)
从剪贴板转换为代码生成支持的类(Shift + Ctrl + Alt + G)
从选定内容转换为代码生成支持的类(Shift + Ctrl + Alt + H)
转换器
- 数组类型合并
- 重复类型预防
- 联合类型
- 可选类型
- 数组类型
已知问题
-
在
Linux上使用键绑定可能会引发错误Command failed: xclip -selection clipboard -o,当Linux缺少剪贴板包时会发生这种情况。要解决此错误,请在终端中运行此命令以安装缺少的包。sudo apt-get install xclip -
匹配错误的类型。根据我的经验,一些API提供者会写入
integer值而不是double,例如,1或1.00而不是1.10。问题在于,此生成器会进行深度对象扫描,并读取每个项以检测值的类型,并返回找到的类型。但是列表工作得很好,如果列表只包含double和integers,列表类型将返回为num。如果您自己编写JSON对象,请尝试提供正确的值类型以获得更好的结果。这都与JSON质量有关:sunglasses