开发工具代码生成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 仓库中 Javarest-assured客户端示例所生成的模型类ArrayOfArrayOfNumberOnly为切入点完整还原OpenAPI 定义 → 代码生成 → Java 源码实现 → 实际使用的整条链路。读完本文你将掌握 swagger-codegen 如何把 OpenAPI 中嵌套的二维数组array of array of number映射为 Java 泛型集合ListListBigDecimal理解生成模型的字段命名、fluent 构建 API、序列化注解与 equals/hashCode/toString 约定并能在自己的生成客户端中正确读写此类模型。一、文档定位一份由 swagger-codegen 自动生成的模型参考页ArrayOfArrayOfNumberOnly.md 是 swagger-codegen 为 Java rest-assured 客户端示例samples/client/petstore/java/rest-assured自动生成的模型文档之一。它的结构非常简洁属于每个模型一份的 API 参考页与同目录下的ArrayOfNumberOnly.md、NumberOnly.md、Pet.md等 40 余份文档共同组成客户端模型的完整文档集完整清单见 docs 目录。原始文档核心内容是一个属性表描述模型的全部字段NameTypeDescriptionNotesarrayArrayNumberListListBigDecimal[optional]从表中可以得到三个关键信息模型类名是ArrayOfArrayOfNumberOnly暗示该模型只包含一个二维数字数组字段是 swagger-codegen 官方 fake 模型petstorefake中用于测试各类数据类型的样例模型之一唯一属性arrayArrayNumber的类型是ListListBigDecimal即列表的列表——外层列表的每个元素本身又是一个数字列表该属性标为optional可选即接口返回的 JSON 中可以不携带该字段。二、源头追溯OpenAPI 规格中的二维数组定义模型文档只是结果真正的源头在 OpenAPISwagger 2.0 / OpenAPI 3.0规格文件中。仓库中的 petstorefake.yaml 给出了该模型的原始定义ArrayOfArrayOfNumberOnly: type: object properties: ArrayArrayNumber: type: array items: type: array items: type: number这段定义体现了 OpenAPI 中嵌套数组的标准写法顶层type: object属性名为ArrayArrayNumber注意规格中字段名以大写 A 开头属性本身是type: array其items又是type: array第二层数组最内层items才是type: number。即数组的数组最内层元素为数字。同样的定义还出现在仓库其他规格文件中例如 OpenAPI 3.0 版本的 petstore3fake.yaml、petstoreMixed3.yaml以及 v2 的 samplesServers.yaml 中swagger-codegen 的测试资源 petstore-with-fake-endpoints-models-for-testing.yaml 也复用了同一份定义。这组规格文件正是 swagger-codegen 测试与示例生成的基准数据源也解释了为什么仓库里不同语言、不同版本示例中都能看到同名模型。从源码结构看ArrayOfArrayOfNumberOnly与NumberOnly单数字字段、ArrayOfNumberOnly一维数字数组在 petstorefake.yaml 中依次排列构成单值 → 一维数组 → 二维数组的递进测试序列用于验证生成器对数组维度与嵌套类型处理能力的边界。三、代码生成从 YAML 到 Java 类的映射规则swagger-codegen 的核心引擎根据模板template将上述 YAML 定义渲染为各语言源码。对于 Java rest-assured 客户端该模型被生成为 ArrayOfArrayOfNumberOnly.java其类型映射关系如下OpenAPI 概念生成结果type: objectmodel独立的 Java 类ArrayOfArrayOfNumberOnly包io.swagger.client.model属性ArrayArrayNumber字段arrayArrayNumberJava 命名规范小驼峰type: array外层List...items: type: array内层ListBigDecimalitems: type: number最内层BigDecimal可以看到OpenAPI 的每一层数组type: array都对应一层 Java 泛型List而number类型被映射为java.math.BigDecimal——这是 Java 处理任意精度十进制数如金融金额、高精度测量值的标准类型能避免double/float的浮点误差。类声明与字段定义对应源码ArrayOfArrayOfNumberOnly.java#L34-L36public class ArrayOfArrayOfNumberOnly { SerializedName(ArrayArrayNumber) private ListListBigDecimal arrayArrayNumber null;其中SerializedName(ArrayArrayNumber)来自 Gson 注解com.google.gson.annotations.SerializedName它保证了序列化/反序列化时的 JSON 字段名与 OpenAPI 规格一致即保持大写开头的ArrayArrayNumber而 Java 内部字段名arrayArrayNumber遵循小驼峰规范两者通过注解桥接private ListListBigDecimal arrayArrayNumber null;初始值为null正好与文档中optional标注对应——未设置时序列化会省略该字段而非输出空数组。四、生成源码深度解读fluent API、增删改查与通用约定4.1 链式赋值的 fluent 风格swagger-codegen 生成的 Java 模型普遍采用返回this的 fluent 风格方法。赋值方法ArrayOfArrayOfNumberOnly.java#L38-L41public ArrayOfArrayOfNumberOnly arrayArrayNumber(ListListBigDecimal arrayArrayNumber) { this.arrayArrayNumber arrayArrayNumber; return this; }调用时可以直接链式编写new ArrayOfArrayOfNumberOnly().arrayArrayNumber(rows)返回值仍是当前对象便于连续构建。4.2 逐行追加addArrayArrayNumberItem针对列表的列表这种嵌套结构生成器额外提供了逐元素追加方法ArrayOfArrayOfNumberOnly.java#L43-L49public ArrayOfArrayOfNumberOnly addArrayArrayNumberItem(ListBigDecimal arrayArrayNumberItem) { if (this.arrayArrayNumber null) { this.arrayArrayNumber new ArrayListListBigDecimal(); } this.arrayArrayNumber.add(arrayArrayNumberItem); return this; }该方法在字段为null时自动初始化为ArrayList然后追加一行一个ListBigDecimal。注意这里追加的单位是一行数组因此调用 N 次就相当于在 JSON 中形成 N 行数字。4.3 标准的 getter / setter对应文档属性表模型提供标准访问器ArrayOfArrayOfNumberOnly.java#L56-L62ApiModelProperty(value ) public ListListBigDecimal getArrayArrayNumber() { return arrayArrayNumber; } public void setArrayArrayNumber(ListListBigDecimal arrayArrayNumber) { this.arrayArrayNumber arrayArrayNumber; }getArrayArrayNumber()上还标注了 Swagger 注解ApiModelPropertyio.swagger.annotations.ApiModelProperty供文档工具与 Swagger 运行时识别该属性。4.4 equals / hashCode / toString 约定与 Java 对象规范一致生成类重写了三个方法ArrayOfArrayOfNumberOnly.java#L65-L91equals先判断对象同一性再判null与类类型最后用Objects.equals(this.arrayArrayNumber, other.arrayArrayNumber)按字段比较hashCode基于Objects.hash(arrayArrayNumber)计算toString输出class ArrayOfArrayOfNumberOnly { arrayArrayNumber: ... }形式内部通过toIndentedString将多行字符串按 4 空格缩进保证日志可读性。五、实战用法构造、序列化与解析5.1 构造二维数组模型基于上述生成 API构造一个包含两行数字的模型import io.swagger.client.model.ArrayOfArrayOfNumberOnly; import java.math.BigDecimal; import java.util.Arrays; import java.util.List; ArrayOfArrayOfNumberOnly model new ArrayOfArrayOfNumberOnly() .addArrayArrayNumberItem(Arrays.asList(new BigDecimal(1.1), new BigDecimal(2.2))) .addArrayArrayNumberItem(Arrays.asList(new BigDecimal(3.3), new BigDecimal(4.4), new BigDecimal(5.5)));此时模型内部等价于 JSON 结构{ ArrayArrayNumber: [ [1.1, 2.2], [3.3, 4.4, 5.5] ] }注意由于addArrayArrayNumberItem追加的粒度是一行二维数组的每行长度可以不同这是它与规整矩形数组如矩阵的本质区别。5.2 整体替换与读取如果已有完整二维列表可直接用 setter 一次性赋值ListListBigDecimal rows new ArrayList(); rows.add(Arrays.asList(new BigDecimal(1), new BigDecimal(2))); model.setArrayArrayNumber(rows); ListListBigDecimal result model.getArrayArrayNumber();遍历时逐层解包for (ListBigDecimal row : result) { for (BigDecimal value : row) { System.out.println(value); } }5.3 在 rest-assured 客户端中的使用场景该模型归属于samples/client/petstore/java/rest-assured示例客户端。它所在的包io.swagger.client.model存放全部数据模型而 API 调用由io.swagger.client.api包下的 Api 类如 FakeApi.java负责底层通过 rest-assured 发送 HTTP 请求。从 FakeApi.java 的 import 列表 可以看到java.math.BigDecimal同样用于fakeOuterNumberSerialize等外层类型序列化测试接口与本文模型使用同一套数值类型策略。模型对象经由 Gson 按SerializedName完成与 JSON 的互转后即可作为请求体或响应体参与客户端调用。六、跨语言印证同一模型在各生成客户端中的形态由于 swagger-codegen 是模板驱动引擎同一 OpenAPI 定义在其它语言示例中会生成对应形态的类可用来印证映射规则的通用性。例如 C# 示例 ArrayOfArrayOfNumberOnly.cs 中属性被生成为ListListdecimal?可空 decimal并提供构造函数参数C# 测试资源 ArrayOfArrayOfNumberOnlyTests.cs 中保留了针对该模型实例化与属性测试的模板注释。此外 bash 客户端文档 ArrayOfArrayOfNumberOnly.md 同样列出了该模型。这从侧面说明array of array of number这一模式在各语言生成器中被统一建模为二维集合/数组且字段名规范因语言而异Java 为arrayArrayNumberJSON 线上名统一为ArrayArrayNumber。七、小结与延伸阅读ArrayOfArrayOfNumberOnly是一个典型的 swagger-codegen 生成模型文档页docs/ArrayOfArrayOfNumberOnly.md描述其唯一属性arrayArrayNumberListListBigDecimal、可选生成源码ArrayOfArrayOfNumberOnly.java则以 fluent 追加方法 Gson 注解 标准对象约定完整实现了该结构。理解它等于掌握了 swagger-codegen 对嵌套集合类模型从 OpenAPI 规格到 Java 代码的全部映射规则。如需深入可在仓库中继续对照一维版本模型文档ArrayOfNumberOnly.md 与 NumberOnly.md对比数组维度的差异OpenAPI 3.0 规格定义petstore3fake.yaml生成器的测试资源集petstore-with-fake-endpoints-models-for-testing.yaml该示例客户端的 API 文档入口FakeApi.md。赞分享开发工具代码生成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 将二维数组模型生成 C 客户端以 ArrayOfArrayOfNumberOnly 为例使用 swagger codegen 将二维数组模型生成 C 客户端以 ArrayOfArrayOfNumberOnly 为例 本文以 swagger cod开发工具代码生成API设计Swagger Codegen 中的数组模型生成以 Java (REST Assured) 客户端 AnimalFarm 为例Swagger Codegen 中的数组模型生成以 Java REST Assured 客户端 AnimalFarm 为例 导读 AnimalFarm.md开发工具代码生成API设计swagger-codegen Bash 客户端二维数组模型文档深度解析以 ArrayOfArrayOfNumberOnly 为例swagger codegen Bash 客户端二维数组模型文档深度解析以 ArrayOfArrayOfNumberOnly 为例 本文以 swagger c开发工具代码生成API设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考