我正在编写Swagger 2.0规范的API基本上是任何JSON值的存储。
我想要一个读取值的路径和一个存储非预定义深度的任何JSON值(null,number,integer,string,object,array)的路径。
不幸的是,似乎Swagger 2.0对输入和输出的模式非常严格,并且不允许JSON Schema允许的整套模式。 Swagger编辑器不允许使用混合值(例如,可以是布尔值或整数的属性)或松散定义的数组(必须严格定义项的类型)和对象。
所以我通过定义MixedValue
架构来尝试解决方法:
---
swagger: '2.0'
info:
version: 0.0.1
title: Data store API
consumes:
- application/json
produces:
- application/json
paths:
/attributes/{attrId}/value:
parameters:
- name: attrId
in: path
type: string
required: true
get:
responses:
'200':
description: Successful.
schema:
$ref: '#/definitions/MixedValue'
put:
parameters:
- name: value
in: body
required: true
schema:
$ref: '#/definitions/MixedValue'
responses:
responses:
'201':
description: Successful.
definitions:
MixedValue:
type: object
properties:
type:
type: string
enum:
- 'null'
- boolean
- number
- integer
- string
- object
- array
boolean:
type: boolean
number:
type: number
integer:
type: integer
string:
type: string
object:
description: deep JSON object
type: object
additionalProperties: true
array:
description: deep JSON array
type: array
required:
- type
但Swagger编辑器拒绝松散定义的object
和array
属性。
问题: - 有没有办法解决这个问题? - 它只是一个Swagger编辑器错误还是Swagger 2.0规范的强大限制? - 是否有更好的方法(最佳实践)来指定我需要的东西? - 对于某些使用我的API规范的语言,我可以期待swagger生成的代码有一些限制吗?
答案 0 :(得分:16)
可以像这样定义任意类型的模式:
definitions:
AnyValue: {}
或者如果您想要description
:
definitions:
AnyValue:
description: 'Can be anything: string, number, array, object, etc.'
如果没有定义的type
,AnyValue
可以是任何内容 - 字符串,数字,布尔值,数组,对象等。有关type
的详细信息,请参阅this Q&A - 更少的架构工作。
在OpenAPI 3.0中,您可以添加nullable: true
以允许null
值:
components:
schemas:
AnyValue:
nullable: true
description: Can be anything, including null.
以下是Swagger Editor 2.0使用AnyValue
架构处理body参数的方式:
我不知道代码生成器如何处理这个问题。
答案 1 :(得分:0)
也许这就是你正在寻找的“图案化物体”:
字段模式:^ x -
类型:任何
描述:允许扩展Swagger Schema。字段名称必须以x-开头,例如x-internal-id。值可以是null,基元,数组或对象。有关详细信息,请参阅供应商扩展。
来源:https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md