OpenAPI仕様 の例を見てきましたが:
type: object additionalProperties: $ref: '#/definitions/ComplexModel'
私には明らかではありませんなぜadditionalProperties
の使用はMap/Dictionaryの正しいスキーマです。
また、仕様がadditionalProperties
について述べなければならない具体的なことは次のことだけです。
次のプロパティはJSONスキーマ定義から取得されますが、定義はSwagger仕様に合わせて調整されています。それらの定義は、JSONスキーマの定義と同じです。元の定義がJSONスキーマ定義を参照する場合のみ、代わりにスキーマオブジェクト定義が使用されます。
- アイテム
- すべての
- 物性
- additionalProperties
チェン、私は あなたの答え が正しいと思います。
役に立つかもしれないさらなる背景:
JSONの元のコンテキストであったJavaScriptでは、オブジェクトは文字列から値へのハッシュマップのようなものです。一部の値はデータであり、他の値は関数です。各名前と値のペアをプロパティと考えることができます。ただし、JavaScriptにはクラスがないため、プロパティ名は事前定義されておらず、各オブジェクトは独自の独立したプロパティセットを持つことができます。
JSONスキーマはproperties
キーワードを使用して、事前に知られている名前と値のペアを検証します。 additionalProperties
(またはpatternProperties
、OpenAPI 2.0ではサポートされていません)を使用して、不明なプロパティを検証します。
明確にするために:
properties
およびadditionalProperties
は、単独でまたは組み合わせて使用できます。 additionalPropertiesがプロパティなしで単独で使用される場合、オブジェクトは基本的にmap<string, T>
ここで、TはadditionalPropertiesサブスキーマに記述されているタイプです。元の質問に答えるのに役立つかもしれません。properties
で指定された名前のいずれかに一致する場合、その値はそのプロパティに提供されたサブスキーマに対してのみ有効である必要があります。 additionalProperties
サブスキーマが提供される場合、properties
マップに含まれるではないのプロパティを検証するためにのみ使用されます。additionalProperties
にはいくつかの制限があります。これらの制限を文書化しました here 。まず、 additionalProperties
のより良い説明 を見つけました。
オブジェクトの場合、これを指定すると、
properties
で定義されたプロパティに加えて、他のすべてのプロパティ名が許可されます。それらの値はそれぞれ、ここで指定されたスキーマオブジェクトと一致する必要があります。これが指定されていない場合、properties
で定義されているプロパティ以外のプロパティは許可されません。
だからここに私が最終的にこれを理解した方法があります:
properties
を使用すると、 Pythonのnamedtuple に似たプロパティの既知のセットを定義できますが、 Pythonのdict またはその他のハッシュのようなものが必要な場合は/ mapでは、キーの数やキーの種類を事前に指定できないため、additionalProperties
を使用する必要があります。
additionalProperties
は任意のプロパティ名と一致します(dict
のキーとして機能し、$ref
またはtype
はdict
の値のスキーマになります。特定のオブジェクトごとに同じ名前のプロパティが複数存在しないようにする必要があるため、一意のキーを適用できます。
キーとして不変の値を受け入れるPythonのdict
とは異なり、ここでのキーは本質的にプロパティ名であるため、文字列でなければならないことに注意してください。 (ありがとう Ted Epstein その説明のため)。この制限は、 json specification のpair := string : value
まで追跡できます。