关于 dart-model-from-json
此 Skill 根据输入的 JSON 结构生成 Dart 模型类,并使用 `json_annotation` 和 `equatable`。它规定字段类型、嵌套类、相等性、序列化方法及输出顺序。
主要功能
- 01JSON 到 Dart 类型映射
- 02生成嵌套对象类
- 03提供 `fromJson` 和 `toJson`
- 04支持 `copyWith` 和值相等
- 05按依赖顺序输出类
适用场景
- 01根据 API 响应创建 Dart 模型
- 02在 Dart 中表示嵌套 JSON 对象
- 03生成支持序列化和相等比较的模型
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ somnio-software/ somnio-ai-tools --skill dart-model-from-json安装后在 Claude Code 中输入/dart-model-from-json确认已加载。
详细介绍
Dart Model from JSON
使用 json_annotation 和 equatable,根据 JSON 结构生成 Dart 模型类。
输入
用户提供一个 JSON 对象,可以使用代码块,也可以直接粘贴。如果未提供 JSON,请先询问用户。
要求
- 使用
json_annotation进行 JSON 序列化 - 使用
equatable实现值相等性 - 包含
copyWith方法 - 包含
fromJson和toJson方法 - 包含供 equatable 使用的
propsgetter - 不使用
@immutable装饰器 - 不添加文档注释
- 除非用户明确要求,否则不添加
@JsonKey注解
模型结构
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
part 'model_name.g.dart';
@JsonSerializable()
class ModelName extends Equatable {
ModelName({
required this.field1,
this.field2,
this.field3 = defaultValue,
});
final String field1;
final int? field2;
final bool field3;
ModelName copyWith({
String? field1,
int? field2,
bool? field3,
}) {
return ModelName(
field1: field1 ?? this.field1,
field2: field2 ?? this.field2,
field3: field3 ?? this.field3,
);
}
static ModelName fromJson(Map<String, dynamic> json) => _$ModelNameFromJson(json);
Map<String, dynamic> toJson() => _$ModelNameToJson(this);
@override
List<Object?> get props => [field1, field2, field3];
}
字段类型映射
| JSON 类型 | Dart 类型 |
|---|---|
string | String |
number(整数) | int |
number(小数) | double |
boolean | bool |
null 或缺失 | 可空类型(例如 String?) |
| 基本类型数组 | List<Type> |
| 对象数组 | List<ClassName> |
object | 独立类 |
命名约定
- 类名:PascalCase
- 字段名:camelCase
- 必需字段:非空类型,并使用
required关键字 - 可选字段:使用
?标记为可空
嵌套对象规则
何时创建独立类
- 对包含多个属性的对象,始终创建一个类
- 对象数组中的数组项,始终创建一个类
- 基本类型数组使用
List<String>、List<int>等,无需创建类
类名推断
| 上下文 | 类名 |
|---|---|
address 字段(对象) | Address |
profile.preferences(嵌套对象) | Preferences |
orders[](对象数组) | Order |
orders[].items[](嵌套数组) | OrderItem |
如果上下文不明确,请询问用户希望使用的类名。
输出格式
将每个类分别放在一个代码块中,并标注建议的文件名:
user.dart
// ... User class
address.dart
// ... Address class
按依赖顺序列出所有必需的类(先列叶子类,最后列根类)。
示例
输入 JSON:
{
"id": "123",
"name": "John Doe",
"age": 30,
"isActive": true,
"tags": ["tag1", "tag2"],
"address": {
"street": "123 Main St",
"city": "New York",
"zipCode": "10001"
}
}
输出:
address.dart
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
part 'address.g.dart';
@JsonSerializable()
class Address extends Equatable {
Address({
required this.street,
required this.city,
required this.zipCode,
});
final String street;
final String city;
final String zipCode;
Address copyWith({
String? street,
String? city,
String? zipCode,
}) {
return Address(
street: street ?? this.street,
city: city ?? this.city,
zipCode: zipCode ?? this.zipCode,
);
}
static Address fromJson(Map<String, dynamic> json) => _$AddressFromJson(json);
Map<String, dynamic> toJson() => _$AddressToJson(this);
@override
List<Object?> get props => [street, city, zipCode];
}
user.dart
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'address.dart';
part 'user.g.dart';
@JsonSerializable()
class User extends Equatable {
User({
required this.id,
required this.name,
required this.age,
required this.isActive,
required this.tags,
required this.address,
});
final String id;
final String name;
final int age;
final bool isActive;
final List<String> tags;
final Address address;
User copyWith({
String? id,
String? name,
int? age,
bool? isActive,
List<String>? tags,
Address? address,
}) {
return User(
id: id ?? this.id,
name: name ?? this.name,
age: age ?? this.age,
isActive: isActive ?? this.isActive,
tags: tags ?? this.tags,
address: address ?? this.address,
);
}
static User fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
@override
List<Object?> get props => [id, name, age, isActive, tags, address];
}
评论
支持 Markdown