自定义模板与扩展:如何深度定制json_model的生成规则
自定义模板与扩展如何深度定制json_model的生成规则【免费下载链接】json_modelGenerate model class from Json file. 一行命令通过Json文件生成Dart Model类。项目地址: https://gitcode.com/gh_mirrors/js/json_model在Dart和Flutter开发中数据模型是应用程序的核心组成部分。json_model作为一款强大的代码生成工具通过一行命令就能将JSON文件转换为Dart Model类极大地提升了开发效率。然而每个项目都有独特的需求和编码规范如何让生成的代码完全符合你的团队标准呢本文将为你揭示json_model的自定义模板与扩展机制让你能够深度定制生成规则打造专属的代码生成流程。理解json_model的核心工作原理json_model的核心思想是一次配置自动生成。它通过读取JSON文件中的数据结构结合预设的模板规则生成对应的Dart类文件。这种设计理念确保了项目中只维护JSON源文件而生成的Dart文件可以随时重新生成避免了手动维护模型类可能带来的不一致性问题。在lib/index.dart文件中我们可以看到核心的代码生成逻辑。工具使用了一个固定的模板字符串来构建最终的Dart文件const tpl import package:json_annotation/json_annotation.dart;\n%t\npart %s.g.dart;\n\nJsonSerializable()\nclass %s {\n %s();\n\n %s\n factory %s.fromJson(MapString,dynamic json) _\$%sFromJson(json);\n MapString, dynamic toJson() _\$%sToJson(this);\n}\n;这个模板定义了生成文件的基本结构其中%s是占位符会在运行时被实际的类名和字段信息替换。而%t则用于插入额外的import语句。自定义模板打造专属代码风格1. 修改默认模板文件json_model提供了自定义模板的机制允许你完全控制生成的代码格式。在项目根目录下你可以找到一个名为model.tpl的模板文件import package:json_annotation/json_annotation.dart; %t part %s.g.dart; JsonSerializable() class %s { %s(); %s factory %s.fromJson(MapString,dynamic json) _$%sFromJson(json); MapString, dynamic toJson() _$%sToJson(this); }这个模板文件定义了生成的Dart类的基本结构。你可以根据需要修改这个模板例如添加自定义注释在类定义前添加项目特定的文档注释修改导入格式调整import语句的排列方式添加额外方法在类中添加自定义的辅助方法改变代码风格调整缩进、换行等格式规范2. 理解模板占位符模板中的占位符有特定的含义%t用于插入import语句的位置%s依次对应以下参数文件名小写类名首字母大写类名构造函数字段定义字符串类名fromJson方法类名fromJson方法参数类名toJson方法3. 创建高级模板示例假设你的团队要求所有模型类都实现toString()方法并且需要添加创建时间的字段。你可以这样修改模板import package:json_annotation/json_annotation.dart; import package:intl/intl.dart; %t part %s.g.dart; JsonSerializable() class %s { %s(); %s /// 创建时间 final DateTime createdAt DateTime.now(); factory %s.fromJson(MapString,dynamic json) _$%sFromJson(json); MapString, dynamic toJson() _$%sToJson(this); override String toString() { return %s(${toJson()}); } }JSON元数据配置灵活的生成控制除了修改模板json_model还提供了强大的元数据配置功能。通过在JSON文件中添加meta字段你可以精细控制每个文件的生成行为。1. 基本元数据配置在example/jsons/user.json中我们可以看到元数据配置的示例{ meta: { import: [ test_dir/profile.dart ], comments: { name: 名字 }, nullable: false, ignore: false }, // ... 字段定义 }2. 可用的元数据选项import指定需要导入的其他Dart文件comments为字段添加注释说明nullable控制字段是否可为空ignore是否跳过当前文件的生成className自定义生成的类名3. 字段级注释配置通过comments配置你可以为特定字段添加详细的注释{ meta: { comments: { email: 用户邮箱地址必须符合邮箱格式, phone: 手机号码11位数字, createdAt: 账户创建时间自动生成 } }, email: userexample.com, phone: 13800138000, createdAt: 2023-01-01T00:00:00Z }生成的Dart代码会自动包含这些注释// 用户邮箱地址必须符合邮箱格式 late String email; // 手机号码11位数字 late String phone; // 账户创建时间自动生成 late String createdAt;扩展生成规则高级定制技巧1. 自定义字段类型映射在lib/index.dart的getDataType函数中json_model定义了类型映射规则。如果你需要支持自定义类型可以扩展这个函数String getDataType(v, SetString set, String current, String tag) { current current.toLowerCase(); if (v is bool) { return bool; } else if (v is num) { return num; } else if (v is Map) { return MapString,dynamic; } else if (v is List) { return List; } else if (v is String) { // 处理自定义类型前缀 if (v.startsWith($tag[])) { final type changeFirstChar(v.substring(3), false); if (type.toLowerCase() ! current !isBuiltInType(type)) { set.add(import $type.dart); } return List${changeFirstChar(type)}; } else if (v.startsWith(tag)) { final fileName changeFirstChar(v.substring(1), false); if (fileName.toLowerCase() ! current) { set.add(import $fileName.dart); } return changeFirstChar(fileName); } else if (v.startsWith()) { return v; } // 添加自定义类型判断 else if (v.startsWith(DateTime)) { return DateTime; } return String; } else { return String; } }2. 支持自定义注解json_model支持在JSON字段中使用Dart注解。例如你可以使用json_annotation包中的各种注解{ JsonKey(name: user_name) String: name, JsonKey(defaultValue: unknown) String?: nickname, JsonKey(ignore: true) Profile?: profile }3. 引用其他模型类通过特殊的符号引用json_model支持模型间的关联$user引用User类$[]user引用User类的列表$[]String字符串列表命令行参数灵活的生成控制json_model提供了丰富的命令行参数让你可以在不修改JSON文件的情况下控制生成行为1. 基本参数使用# 指定源JSON目录 pub run json_model srccustom_jsons # 指定输出目录 pub run json_model distdata_models # 组合使用 pub run json_model srcjson_files distdata # 生成可空类型字段 pub run json_model --nullable # 清理生成的文件 pub run json_model --clean2. 自定义引用符号默认使用$作为引用符号但你可以自定义pub run json_model tag#这样在JSON文件中就可以使用#user和#[]user来引用其他模型类。集成到构建流程自动化代码生成1. 在pubspec.yaml中配置将json_model集成到项目的构建流程中dev_dependencies: json_model: ^1.0.0 json_serializable: ^5.0.0 build_runner: ^2.0.0 scripts: generate: flutter packages pub run json_model watch: flutter packages pub run build_runner watch build: flutter packages pub run build_runner build2. 创建代码生成脚本在bin/目录下创建自定义的生成脚本import package:json_model/json_model.dart; void main() { // 自定义生成参数 run([ srclib/json_schemas, distlib/generated/models, --nullable ]); }3. 结合CI/CD流程在持续集成流程中自动生成代码# .github/workflows/generate-models.yml name: Generate Models on: push: paths: - jsons/** - lib/json_schemas/** jobs: generate: runs-on: ubuntu-latest steps: - uses: actions/checkoutv2 - uses: subosito/flutter-actionv2 - run: flutter pub get - run: flutter packages pub run json_model - run: | git config --global user.name GitHub Actions git config --global user.email actionsgithub.com git add lib/models/ git commit -m chore: regenerate models || echo No changes to commit git push最佳实践打造高效的工作流1. 建立团队规范统一的模板文件在团队项目中共享同一个model.tpl文件标准的JSON结构定义团队内部的JSON编写规范版本控制将生成的模型类纳入版本控制但标记为自动生成2. 处理复杂场景对于需要手动修改的模型类使用ignore配置{ meta: { ignore: true }, // ... 字段定义 }这样可以在首次生成后手动修改代码而不会被后续的自动生成覆盖。3. 性能优化技巧增量生成只处理修改过的JSON文件缓存机制避免重复生成相同的代码并行处理对于大量JSON文件考虑并行处理常见问题与解决方案1. 生成的代码不符合团队规范解决方案修改model.tpl模板文件确保生成的代码符合团队的编码规范。可以添加团队特定的注释、导入顺序要求等。2. 需要支持自定义数据类型解决方案扩展getDataType函数添加对新数据类型的支持。或者通过meta中的import配置引入自定义类型。3. 生成的字段顺序不符合预期解决方案JSON对象本身是无序的但Dart类中的字段顺序很重要。可以通过修改生成逻辑按照特定规则对字段进行排序。4. 需要添加额外的类方法解决方案在模板中添加额外的方法占位符或者在生成后通过脚本自动添加通用方法。总结掌握自定义的艺术json_model的强大之处不仅在于它能自动生成Dart Model类更在于它提供了完整的自定义和扩展机制。通过掌握模板修改、元数据配置和命令行参数你可以完全控制代码风格确保生成的代码符合团队规范灵活应对复杂需求支持各种自定义类型和注解自动化工作流程集成到CI/CD中实现全自动代码生成提升开发效率减少重复劳动专注于业务逻辑记住好的工具应该适应你的工作流程而不是让你去适应工具。json_model正是这样一个灵活的工具通过深度定制它能够完美融入你的开发环境成为提升生产力的得力助手。无论你是个人开发者还是团队负责人掌握json_model的自定义与扩展技巧都能让你的Dart/Flutter开发体验更加顺畅高效。开始定制属于你自己的代码生成规则吧【免费下载链接】json_modelGenerate model class from Json file. 一行命令通过Json文件生成Dart Model类。项目地址: https://gitcode.com/gh_mirrors/js/json_model创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考