mcpField
D
dart-model-from-json

dart-model-from-json

github.com/somnio-software开发863 次安装2 天前更新
代码仓库

关于 dart-model-from-json

此 Skill 根据输入的 JSON 结构生成 Dart 模型类,并使用 `json_annotation` 和 `equatable`。它规定字段类型、嵌套类、相等性、序列化方法及输出顺序。

主要功能

  1. 01JSON 到 Dart 类型映射
  2. 02生成嵌套对象类
  3. 03提供 `fromJson` 和 `toJson`
  4. 04支持 `copyWith` 和值相等
  5. 05按依赖顺序输出类

适用场景

  1. 01根据 API 响应创建 Dart 模型
  2. 02在 Dart 中表示嵌套 JSON 对象
  3. 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 使用的 props getter
  • 不使用 @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 类型
stringString
number(整数)int
number(小数)double
booleanbool
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