OpenAPI 3.0如何合并两个数组的元素为单个数组?
OpenAPI 3.0 合并两个数组组件的优雅方案
你想将AquaticMammals和LandMammals两个数组的元素合并为一个新数组,同时避免重复维护第三份动物类型列表,但之前尝试anyOf/allOf的写法得到了数组嵌套的结果,达不到预期。
要实现类似JavaScript扩展运算符的效果,核心思路是把数组的items部分抽离为独立可复用的Schema,这样就能在新数组中直接组合这些元素定义,无需重复编写动物列表:
步骤1:抽离数组元素的Schema
先将原两个数组中的items逻辑单独定义成组件,消除重复代码:
components: schemas: # 抽离水生哺乳动物的元素类型定义 AquaticMammalTypes: anyOf: - $ref: '#/components/schemas/Dolphin' - $ref: '#/components/schemas/Otter' - $ref: '#/components/schemas/Seal' - $ref: '#/components/schemas/Beaver' # 抽离陆生哺乳动物的元素类型定义 LandMammalTypes: anyOf: - $ref: '#/components/schemas/Elephant' - $ref: '#/components/schemas/Bear' - $ref: '#/components/schemas/Monkey' - $ref: '#/components/schemas/Camel'
步骤2:重构原有数组组件
让原来的AquaticMammals和LandMammals引用上述抽离的元素定义:
components: schemas: # ... 保留上面的AquaticMammalTypes和LandMammalTypes ... AquaticMammals: type: array items: $ref: '#/components/schemas/AquaticMammalTypes' LandMammals: type: array items: $ref: '#/components/schemas/LandMammalTypes'
步骤3:创建合并后的数组组件
现在可以直接组合两个元素类型Schema,得到包含所有动物的数组:
components: schemas: # ... 保留上面的所有定义 ... Mammals: type: array items: anyOf: - $ref: '#/components/schemas/AquaticMammalTypes' - $ref: '#/components/schemas/LandMammalTypes'
这种方式下,你只需要维护AquaticMammalTypes和LandMammalTypes两份列表,Mammals数组会自动包含所有元素,既不用额外维护第三份副本,也不会出现数组嵌套的问题。
需要说明的是,OpenAPI 3.0本身不支持直接“扩展”数组定义(类似JS的...运算符),但通过抽离元素层的Schema,可以实现逻辑上的复用与合并,这是当前最优雅的可行方案。
内容的提问来源于stack exchange,提问作者Andrew McShane
相关产品推荐
相关产品推荐

