资讯动态

swagger-codegen 生成的 Dart 客户端模型 Category:从 OpenAPI 定义到 `Category.dart` 的完整解析

发布时间:2026/9/23 15:44:28 来源:尧图企业网站定制
开发工具代码生成API设计【免费下载链接】swagger-codegenswagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.项目地址https://gitcode.com/gh_mirrors/sw/swagger-codegen点击查看免费下载导读Category是 Swagger Petstore 示例中描述宠物分类的模型id用于唯一标识分类name用于表示分类名称。本文以 samples/client/petstore/dart/swagger/docs/Category.md 为骨架完整讲解该模型在 Dart 客户端中的类型映射、默认值规则、JSON 序列化行为并对照仓库中的 OpenAPI 定义petstore.json、生成源码category.dart与 Dart 代码生成器实现DartClientCodegen.java帮助你彻底掌握一个 Swagger 模型如何变成一段可用的 Dart 代码。模型文档定位Category.md在生成产物中的角色samples/client/petstore/dart/swagger是由 swagger-codegen 的dart生成器io.swagger.codegen.languages.DartClientCodegen从 Swagger 2.0 的 Petstore 定义生成的完整 Dart 客户端目录结构为samples/client/petstore/dart/swagger/ ├── README.md # 客户端总览安装、API 列表、授权说明 ├── docs/ # 自动生成的 API 文档与模型文档 │ ├── Category.md # 本文讲解的模型文档 │ ├── Pet.md / Tag.md / Order.md / User.md ... │ └── PetApi.md / StoreApi.md / UserApi.md ├── lib/ │ ├── api.dart # 库入口part 指令汇总 │ ├── api_client.dart │ └── model/ │ ├── category.dart │ ├── pet.dart │ └── ... └── pubspec.yaml生成器在DartClientCodegen构造函数中注册了两类文档模板modelDocTemplateFiles.put(object_doc.mustache, .md)和apiDocTemplateFiles.put(api_doc.mustache, .md)并指定文档输出目录modelDocPath docs/见 DartClientCodegen.java。也就是说Category.md 是模板 object_doc.mustache 对Category模型渲染后的结果任何模型文档Pet.md、Tag.md等都遵循同一套结构。引入模型包import package:swagger/api.dart文档给出的加载方式为import package:swagger/api.dart;这行 import 之所以能一行导入全部模型是因为生成器在processOpts()中通过SupportingFile(apilib.mustache, libFolder, api.dart)生成了库入口文件 lib/api.dart。从生成源码看category.dart 首行声明part of swagger.api;api.dart聚合所有模型与 API 类因此只需导入一个api.dart即可使用Category、Pet、PetApi等全部类型。其中swagger是生成包的默认名称对应生成器中的pubName默认值protected String pubName swagger;并写入pubspec.yaml的name字段。若在生成时通过 CLI 参数覆盖该值详见下文生成参数小节package:前缀需同步修改。属性表解读id与nameCategory.md的属性表如下NameTypeDescriptionNotesidint[optional] [default to null]nameString[optional] [default to null]该表格由模板 object_doc.mustache 的变量循环生成。逐项对应关系为NameSwagger 属性名id、name同时由toVarName()统一转成符合 Dart 风格的驼峰变量名TypeSwagger 类型映射后的 Dart 类型。若属性是原始类型primitive直接以粗体展示int、String若是引用其他模型则渲染为指向对应模型文档的相对链接[**Pet**](https://link.gitcode.com/i/96d8b1a41157319c380421e457f33f83)等Description取自 OpenAPI 定义中的descriptionCategory未填写故为空Notes非必填属性标注[optional]有默认值则标注[default to ...]只读属性标注[readonly]。类型映射Swagger 类型 → Dart 类型Category的两个属性在 Swagger 2.0 定义见 petstore.json 的definitions.Category中为Category: { type: object, properties: { id: { type: integer, format: int64 }, name: { type: string } }, xml: { name: Category } }Dart 生成器在typeMapping见 DartClientCodegen.java中完成了映射integerint64→intSwagger 中id的format: int64不影响 Dart 类型Dart 的int本身是 64 位有符号整数string→String其他常见映射boolean→bool、long/short→int、number→num、float/double→double、array→List、map→Map、date/Date→DateTime。映射逻辑位于getSwaggerType()原始类型直接返回 Dart 类型非原始类型则走toModelName()驼峰化后作为类名如引用Pet模型时类型即为Pet。可选与默认值语义Category的id、name在定义中均未标记required因此文档标注[optional]同时没有显式默认值Notes 显示[default to null]。对应到生成代码 category.dartint id null; String name null;即可选属性初始化为null若定义中带默认值如default: 10生成器会将该值写入字段初始化若属性为数组则按toDefaultValue()的逻辑初始化为[]见 DartClientCodegen.java。从文档到代码Category类的生成源码解剖category.dart 是文档属性表的代码化呈现由模板 model.mustache 渲染包含五个部分1. 字段声明part of swagger.api; class Category { int id null; String name null; Category(); }2.toString()调试输出override String toString() { return Category[id$id, name$name, ]; }便于日志打印与断点观察对象状态格式为类名[字段值, ...]。3.fromJson()JSON 反序列化Category.fromJson(MapString, dynamic json) { if (json null) return; id json[id]; name json[name]; }json null时直接返回空对象可选属性保持null。对于引用其他模型的属性如Pet.category生成代码会调用对应模型构造函数new Category.fromJson(json[category])见 pet.dart。4.toJson()JSON 序列化MapString, dynamic toJson() { return { id: id, name: name }; }序列化后 JSON 键名与 Swagger 定义中的属性名保持一致。5. 集合工具方法static ListCategory listFromJson(Listdynamic json) { return json null ? new ListCategory() : json.map((value) new Category.fromJson(value)).toList(); } static MapString, Category mapFromJson(MapString, MapString, dynamic json) { var map new MapString, Category(); if (json ! null json.length 0) { json.forEach((String key, MapString, dynamic value) map[key] new Category.fromJson(value)); } return map; }listFromJson用于解析ListCategory如Pet的tags属性使用的Tag.listFromJson(json[tags])见 pet.dartmapFromJson用于解析MapString, Category形式的响应体。在真实 API 场景中如何使用CategoryCategory通常作为Pet模型的嵌套对象出现。在 petstore.json 中Pet的定义为Pet: { properties: { id: {type: integer, format: int64}, category: {$ref: #/definitions/Category}, name: {type: string}, photoUrls: {type: array, items: {type: string}}, tags: {type: array, items: {$ref: #/definitions/Tag}}, status: {type: string, enum: [available, pending, sold]} } }对应的生成类 pet.dart 中category字段类型为Category引用模型直接以类名作为 Dart 类型。典型用法import package:swagger/api.dart; var pet new Pet(); pet.category new Category() ..id 1 ..name dogs; var json pet.toJson(); // 包含 category: {id: 1, name: dogs} var restored new Pet.fromJson(json); print(restored.category.name); // dogs当 API 返回分类列表时使用Category.listFromJson(...)即可一次完成批量转换。自定义生成影响模型产物的 Dart 生成器参数如果你需要在自己的 OpenAPI 定义上重新生成 Dart 客户端以下生成器参数会直接改变模型文件与文档的形态全部定义于 DartClientCodegen.java参数说明默认值browserClient是否为浏览器端客户端truepubName生成的pubspec.yaml中的包名影响import package:xxx/api.dart的前缀swaggerpubVersionpubspec.yaml中的版本号1.0.0pubDescriptionpubspec.yaml中的描述Swagger API clientuseEnumExtension是否支持x-enum-values扩展来生成枚举falsesourceFolder生成代码的源目录lib/位于其下空字符串使用方式示例CLIjava -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \ -i fixtures/immutable/specifications/v2/petstore.json \ -l dart \ -o out/dart \ -DpubNamemy_petstore \ -DpubVersion0.2.0生成后lib/model/category.dart中part of声明、package:前缀以及文档标题由object_doc.mustache中的{{pubName}}.model.{{classname}}渲染都会随之变化。结合源码的关键结论文档即模板产物Category.md 由 object_doc.mustache 渲染模型文档的属性表与生成代码的字段一一对应类型映射有据可查id → int、name → String的映射来自 DartClientCodegen.java 的typeMapping可选与默认值语义一致未标记required的属性在文档中标注[optional] [default to null]在代码中初始化为null数组则初始化为[]嵌套模型自动处理Pet.category这类引用属性会生成new Category.fromJson(...)调用保证嵌套 JSON 的正确解析见 pet.dart。延伸阅读模型文档目录samples/client/petstore/dart/swagger/docs/Amount、ApiResponse、Order、Tag、User等模型文档结构一致Dart 客户端总览samples/client/petstore/dart/swagger/README.mdAPI 端点、授权方式、安装说明Dart 生成器实现DartClientCodegen.java模型文档模板object_doc.mustache模型代码模板model.mustacheSwagger 2.0 Petstore 定义petstore.json赞分享开发工具代码生成API设计【免费下载链接】swagger-codegenswagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.项目地址https://gitcode.com/gh_mirrors/sw/swagger-codegen点击查看免费下载相关推荐swagger-codegen 生成 Dart 客户端模型 ApiResponse从 Swagger 定义到序列化实现的完整解析swagger codegen 生成 Dart 客户端模型 ApiResponse从 Swagger 定义到序列化实现的完整解析 本篇文章以 swagger开发工具代码生成API设计Windows代理镜像构建失败的5大常见问题及终极解决方案Windows代理镜像构建失败的5大常见问题及终极解决方案 GitHub Actions的Windows代理镜像构建是一个复杂的过程经常会遇到各种构建失败问题开发工具代码生成API设计swagger-codegen Go 客户端模型解析从 OpenAPI 定义到 ArrayOfNumberOnly 的生成与序列化swagger codegen Go 客户端模型解析从 OpenAPI 定义到 ArrayOfNumberOnly 的生成与序列化 ArrayOfNumber开发工具代码生成API设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价