Создайте отклик API-интерфейса swagger/open с массивом неназванных объектов
Я получаю ответ от http-запроса в следующей форме: это массив безымянных массивов и объектов. Я не могу понять правильную спецификацию Swagger (Open API) для этого случая.
[
[
{
"prop1": "hello",
"prop2": "hello again"
},
{
"prop1": "bye",
"prop2": "bye again"
}
],
{
"key": 123
}
]
3 ответа
Ответ зависит от того, какую версию OpenAPI вы используете.
OpenAPI 3.0 поддерживает oneOf
, так что можно определить несколько схем для элементов массива:
openapi: 3.0.0
...
paths:
/something:
get:
responses:
'200':
description: success
content:
application/json:
schema:
type: array
items:
oneOf: # <---------
- type: array
items:
type: object
properties:
prop1:
type: string
prop2:
type: string
- type: object
properties:
key:
type: integer
required:
- key
OpenAPI 2.0 не поддерживает oneOf
или смешанные типы. Максимум, что вы можете сделать, это использовать схему без типов, что означает, что элементы массива могут быть чем угодно - объектами, массивами или примитивами - но вы не можете указать точные типы.
swagger: '2.0'
...
paths:
/:
get:
produces:
- application/json
responses:
'200':
description: success
schema:
type: array
items: {} # <---------
# Example to display in Swagger UI:
example:
- - prop1: hello
prop2: hello again
- prop1: bye
prop2: bye again
- key: 123
Вы можете смешивать Yaml с Json:
openapi: 3.0.3
/users/all:
get:
tags:
- Users
summary: Get all datas.
responses:
"200":
description: Create
content:
application/json:
schema:
type: array
example:
[
{
"id": 1,
"prop1": "CRM",
"prop2": 30908,
"uf": "SP"
}
]
security:
- isAuthorize: []
Моё окружение:
{
"os": "ubuntu-24.04",
"node": "^18.x",
"npm": "^9.x",
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^4.6.0",
}
Я нашел способ, спасибо:
"responses": {
"200": {
"description": "success",
"schema": {
"type": "array",
"items": [{
"type": "array",
"items": {
"type": "object",
"properties": {
"prop1": {
"type": "string",
},
"prop2": {
"type": "string",
}
}
}
},
{
"type": "object",
"properties": {
"key": {
"type": "number"
}
}
}]
}
}
}
}