メインコンテンツまでスキップ

識別子オブジェクト

リクエストの本文またはレスポンスのペイロードが多数の異なるスキーマの 1 つである場合、discriminatorオブジェクトを使用してシリアル化、逆シリアル化、および検証を支援できます。識別子は、スキーマ内の特定のオブジェクトであり、それに関連付けられた値に基づいて、ドキュメントの消費者に代替スキーマを通知するために使用されます。

識別子を使用する場合、インラインスキーマは考慮されません。

固定フィールド

フィールド名タイプ説明
プロパティ名string必須。識別子の値を保持するペイロード内のプロパティの名前。
マッピングMap[ string, string]ペイロード値とスキーマ名または参照の間のマッピングを保持するオブジェクト。

このオブジェクトは、仕様拡張機能を使用して拡張できます。

識別子オブジェクトは、複合キーワードoneOfallOfanyOfのいずれかを使用する場合にのみ有効です。

OAS 3.0 では、応答ペイロードは、次のいずれかのタイプのいずれかであるように記述できます (MAY)。

MyResponseType:  oneOf:  - $ref: '#/components/schemas/Cat'  - $ref: '#/components/schemas/Dog'  - $ref: '#/components/schemas/Lizard'

これは、ペイロードが、検証により、CatDog、またはLizardで記述されたスキーマの 1 つと正確に一致しなければならないことを意味します。この場合、ディスクリミネーターは、スキーマの複雑さに応じて、コストのかかる操作となる可能性がある、一致するスキーマの検証と選択をショートカットするための「ヒント」として機能してもよい(MAY)。次に、どのフィールドがどのスキーマを使用するかを正確に記述することができます。

MyResponseType:  oneOf:  - $ref: '#/components/schemas/Cat'  - $ref: '#/components/schemas/Dog'  - $ref: '#/components/schemas/Lizard'  discriminator:    propertyName: petType

現在、petType名前を持つプロパティが応答ペイロードに存在する必要があり、その値は OAS ドキュメントで定義されているスキーマの名前に対応することが 期待されています。したがって、応答ペイロードは次のようになります。

{  "id": 12345,  "petType": "Cat"}

Catスキーマがこのペイロードと組み合わせて使用されることを示します。

識別子フィールドの値がスキーマ名と一致しない、または暗黙的なマッピングが不可能なシナリオでは、オプションのmapping定義を使用してもよい(MAY)。

MyResponseType:  oneOf:  - $ref: '#/components/schemas/Cat'  - $ref: '#/components/schemas/Dog'  - $ref: '#/components/schemas/Lizard'  - $ref: 'https://gigantic-server.com/schemas/Monster/schema.json'  discriminator:    propertyName: petType    mapping:      dog: '#/components/schemas/Dog'      monster: 'https://gigantic-server.com/schemas/Monster/schema.json'

ここで、 dogの識別子の値は、のデフォルト (暗黙的) 値ではなく、schema #/components/schemas/Dogにマップされます。識別子dogの値が暗黙的または明示的なマッピングに一致しない場合、スキーマを決定できず、検証は失敗する必要があります(SHOULD)。マッピング キーは文字列値である必要がありますが、ツールは比較のために応答値を文字列に変換してもよいです。

anyOf構造と組み合わせて使用すると、識別子の使用により、複数のスキーマが単一のペイロードを満たす可能性がある曖昧さを回避できます。

oneOfanyOfの両方の使用例で、考えられるすべてのスキーマを明示的にリストする必要があります。冗長性を避けるために、識別子を親スキーマ定義に追加してもよく、allOf構造内の親スキーマを構成するすべてのスキーマを代替スキーマとして使用してもよい。

例えば:

components:  schemas:    Pet:      type: object      required:      - petType      properties:        petType:          type: string      discriminator:        propertyName: petType        mapping:          dog: Dog    Cat:      allOf:      - $ref: '#/components/schemas/Pet'      - type: object        # all other properties specific to a `Cat`        properties:          name:            type: string    Dog:      allOf:      - $ref: '#/components/schemas/Pet'      - type: object        # all other properties specific to a `Dog`        properties:          bark:            type: string    Lizard:      allOf:      - $ref: '#/components/schemas/Pet'      - type: object        # all other properties specific to a `Lizard`        properties:          lovesRocks:            type: boolean

このようなペイロード:

{  "petType": "Cat",  "name": "misty"}

Catスキーマが使用されることを示します。同様に、このスキーマは次のようになります。

{  "petType": "dog",  "bark": "soft"}

mapping要素内の定義により、Dogにマップされます。