これはSwaggerへの私の最初の進出なので、優しくしてください。
次の定義があります。
definitions:
Payload:
type: object
properties:
indicators:
type: array
items:
$ref: '#/definitions/Indicator'
Indicator:
type: object
properties:
type:
type: string
computeOn:
type: array
items:
type: string
default:
- close
parameters:
type: object
BBANDS:
properties:
type:
type: string
default: BBANDS
computeOn:
type: array
items:
type: string
default:
- close
parameters:
type: object
properties:
timeperiod:
type: integer
format: int32
default: 5
nbdevup:
type: integer
format: int32
default: 2
nbdevdn:
type: integer
format: int32
default: 2
matype:
type: integer
format: int32
default: 0
DEMA:
properties:
type:
type: string
default: DEMA
computeOn:
type: array
items:
type: string
default:
- close
parameters:
type: object
properties:
timeperiod:
type: integer
format: int32
default: 5
Payload
には、indicator
sの配列であるIndicator
というプロパティがあります。 BBANDS
とDEMA
は、typeIndicator
(これは知っている ' t Swaggerに変換します)。私がやりたいのは、デフォルトで実際のモデルの配列を定義することです。この場合はBBANDS
とDEMA
です。このようなもの:
definitions:
Payload:
type: object
properties:
indicators:
type: array
items:
- '#/definitions/BBANDS'
- '#/definitions/DEMA'
または
definitions:
Payload:
type: object
properties:
indicators:
type: array
items:
- $ref '#/definitions/BBANDS'
- $ref '#/definitions/DEMA'
もちろん、どちらも機能しません。その理由は、Indicator
モデルがindicator
を正しく記述している間、異なるindicator
sが異なるパラメーターセットを持つことができるからです。
いくつかのモデルのリストを本質的に定義する方法や、おそらくBBANDS
およびDEMA
モデルをIndicator
にマップする方法はありますか?
Swagger/OpenAPI 2.0はitems
の複数のタイプをサポートしていませんが、必要なものを記述する方法がいくつかあります。
モデル間で共通の1つのフィールドがあり、それらを区別するために使用できる限り、モデルの継承を使用できます。
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#schemaDiscriminatorhttps://github.com/OAI/OpenAPI-Specification/ blob/master/versions/2.0.md#composition-and-inheritance-polymorphism
あなたの例では、このプロパティはtype
(type="BBANDS"
またはtype="DEMA"
)。だからあなたはできる:
BBANDS
を使用して、DEMA
からIndicator
およびallOf
モデルを継承します。discriminator: type
をIndicator
に変換して、type
プロパティを使用してサブモデルを区別することを示します。Payload
をIndicator
の配列として定義します。この方法では、実際にはBBANDS
の配列またはDEMA
の配列になります。definitions:
Payload:
type: object
properties:
indicators:
type: array
items:
$ref: '#/definitions/Indicator'
Indicator:
type: object
properties:
type:
type: string
# Limit the possible values if needed
#enum:
# - BBANDS
# - DEMA
computeOn:
type: array
items:
type: string
default:
- close
# The "type" property will be used to distinguish between the sub-models.
# The value of the "type" property MUST be the schema name, that is, "BBANDS" or "DEMA".
# (Or in other words, the sub-model schema names must match possible values of "type".)
discriminator: type
required:
- type
BBANDS:
allOf:
- $ref: '#/definitions/Indicator'
- type: object
properties:
parameters:
type: object
properties:
timeperiod:
type: integer
format: int32
default: 5
nbdevup:
type: integer
format: int32
default: 2
nbdevdn:
type: integer
format: int32
default: 2
matype:
type: integer
format: int32
default: 0
DEMA:
allOf:
- $ref: '#/definitions/Indicator'
- type: object
properties:
parameters:
type: object
properties:
timeperiod:
type: integer
format: int32
default: 5
すべてのparameters
が整数の場合、Indicator
がハッシュマップとして定義された単一のモデルparameters
を持つことができます。ただし、この場合、特定のインジケータータイプに対して正確なparameters
を定義する機能が失われます。
definitions:
Indicator:
type: object
properties:
type:
type: string
enum:
- BBANDS
- DEMA
computeOn:
type: array
items:
type: string
default:
- close
parameters:
type: object
properties:
# This is a common parameter in both BBANDS and DEMA
timeperiod:
type: integer
format: int32
default: 5
# This will match additional parameters "nbdevup", "nbdevdn", "matype" in BBANDS
additionalProperties:
type: integer