25

OpenAPI 2.0、スキーマ オブジェクト、またはSwagger 2.0、スキーマ オブジェクト、およびdiscriminatorフィールドの定義を次のように参照します。

ポリモーフィズムのサポートを追加します。識別子は、このスキーマを継承する他のスキーマを区別するために使用されるスキーマ プロパティ名です。使用されるプロパティ名は、このスキーマで定義する必要があり、requiredプロパティ リストに含まれている必要があります。使用する場合、値はこのスキーマまたはそれを継承するスキーマの名前でなければなりません。

私の混乱/質問:

  • 継承またはポリモーフィズムで正確にどのような役割を果たしているのか、私にはあいまいです。discriminatorそれが正確に何をし、それを使用しない場合はどうなるかを示す実際の例で誰かが説明してもらえますか? 一部の操作でそれに依存するエラー、警告、またはツールはありますか?
  • swagger -editorが をサポートしておらずdiscriminator、このフィールドが他のツールで使用されているということですか?

私がこれまでに試したこと:

  • 私は、swagger-editorと同じドキュメント (以下にも記載) の例を使用して、このプロパティをいじって、その特別な動作が見られるかどうかを確認しようとしました。プロパティを変更して削除し、モデルを 1 レベル深く拡張して、新しいサブモデルで同じことを試しましたが、 swagger-editorDogのプレビューに変更は見られませんでした。
  • オンラインで、特にスタックオーバーフローの質問を検索してみましたが、関連する情報は見つかりませんでした。

実験に使用したサンプルコード:

definitions:
  Pet:
    type: object
    discriminator: petType
    properties:
      name:
        type: string
      petType:
        type: string
    required:
    - name
    - petType
  Cat:
    description: A representation of a cat
    allOf:
    - $ref: '#/definitions/Pet'
    - type: object
      properties:
        huntingSkill:
          type: string
          description: The measured skill for hunting
          default: lazy
          enum:
          - clueless
          - lazy
          - adventurous
          - aggressive
      required:
      - huntingSkill
  Dog:
    description: A representation of a dog
    allOf:
    - $ref: '#/definitions/Pet'
    - type: object
      properties:
        packSize:
          type: integer
          format: int32
          description: the size of the pack the dog is from
          default: 0
          minimum: 0
      required:
      - packSize
4

2 に答える 2

13

このgoogle groupによると、discriminatorはプロパティの上で使用されallOf、ポリモーフィズムのスーパー タイプで定義されます。が使用されていない場合discriminatorallOfキーワードは、モデルが合成のために他のモデルのプロパティを含むことを示します。

サンプル コードと同様に、は のプロパティPetを持つスーパー タイプであり、 のサブタイプです。以下は、オブジェクトの json の例です。petTypediscriminatorCatPetCat

{
  "petType": "Cat",
  "name": "‎Kitty"
}

の使用はdiscriminator、オブジェクトのタイプを識別するために使用されるプロパティを示すことを意図しています。を使用して定義オブジェクトを適切にサポートできるツールがあると仮定するとdiscriminator、プロパティをスキャンして型を判別できます。たとえば、オブジェクトがCatに従って識別されpetTypeます。

ただし、discriminatorフィールドは現在のバージョンの仕様またはサンプルで明確に定義されていません (問題 #403を参照)。私の知る限り、現時点で Swagger が適切にサポートするツールはありません。

discriminatorモデルにタイプを決定するために使用されるプロパティがある場合に使用できます。この場合、自然に適合し、他の開発者がポリモーフィズムの関係を理解するための指標として使用できます。サポートするReDocなどのサードパーティ製ツールdiscriminator(petTypeこのgifを参照) を検討している場合、これが役立つ場合があります。

于 2016-09-27T16:52:46.617 に答える
6

OpenApi 3 では、ディスクリミネーターの機能が大幅に改善されました。ディスクリミネーター プロパティの名前を含むディスクリミネーター オブジェクトと、そのプロパティの値のスキーマ名へのマッピングを提供するようになりました。

(あなたが OpenApi 2 について質問したことは承知していますが、これは 3 で大幅に改善されているので、うまく利用できることを願っています)。

v3.0.0 仕様については、https ://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#discriminatorObject を参照してください。

于 2017-09-27T21:20:53.133 に答える