You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: versions/3.2.0.md
+28-18Lines changed: 28 additions & 18 deletions
Original file line number
Diff line number
Diff line change
@@ -2332,7 +2332,8 @@ The OpenAPI Specification's base vocabulary is comprised of the following keywor
2332
2332
2333
2333
Field Name | Type | Description
2334
2334
---|:---:|---
2335
-
<a name="schemaDiscriminator"></a>discriminator | [Discriminator Object](#discriminatorObject) | Adds support for polymorphism. The discriminator is an object name that is used to differentiate between other schemas which may satisfy the payload description. See [Composition and Inheritance](#schemaComposition) for more details.
Object](#discriminatorObject) | Adds support for polymorphism. The discriminator is used to determine which of a set of schemas a payload is expected to satisfy. See [Composition and Inheritance](#schemaComposition) for more details.
2336
2337
<a name="schemaXml"></a>xml | [XML Object](#xmlObject) | This MAY be used only on properties schemas. It has no effect on root schemas. Adds additional metadata to describe the XML representation of this property.
2337
2338
<a name="schemaExternalDocs"></a>externalDocs | [External Documentation Object](#externalDocumentationObject) | Additional external documentation for this schema.
2338
2339
<a name="schemaExample"></a>example | Any | A free-form property to include an example of an instance for this schema. To represent examples that cannot be naturally represented in JSON or YAML, a string value can be used to contain the example with escaping where necessary.<br><br>**Deprecated:** The `example` property has been deprecated in favor of the JSON Schema `examples` keyword. Use of `example` is discouraged, and later versions of this specification may remove it.
@@ -2345,13 +2346,8 @@ The OpenAPI Specification allows combining and extending model definitions using
2345
2346
`allOf`takes an array of object definitions that are validated *independently* but together compose a single object.
2346
2347
2347
2348
While composition offers model extensibility, it does not imply a hierarchy between the models.
2348
-
To support polymorphism, the OpenAPI Specification adds the `discriminator` field.
2349
-
When used, the `discriminator` will be the name of the property that decides which schema definition validates the structure of the model.
2350
-
As such, the `discriminator` field MUST be a required field.
2351
-
There are two ways to define the value of a discriminator for an inheriting instance.
2352
-
- Use the schema name.
2353
-
- Override the schema name by overriding the property with a new value. If a new value exists, this takes precedence over the schema name.
2354
-
As such, inline schema definitions, which do not have a given id, *cannot* be used in polymorphism.
2349
+
To support polymorphism, the OpenAPI Specification adds the `discriminator` keyword.
2350
+
When used, the `discriminator` will indicate the name of the property that hints which schema definition is expected to validate the structure of the model.
When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation. The discriminator is a specific object in a schema which is used to inform the consumer of the document of an alternative schema based on the value associated with it.
2697
+
When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation. The `discriminator` keyword is used to inform the consumer of the document which of the alternatives is expected or preferred.
2702
2698
2703
-
When using the discriminator, _inline_ schemas will not be considered.
2699
+
`discriminator`uses a schema's "name" to automatically map a property value to
2700
+
a schema. The schema's "name" is the property name used when declaring the
2701
+
schema as a component in an OpenAPI document. For example, the name of the
2702
+
schema at `#/components/schemas/Cat` is "Cat". Therefore, when using
2703
+
`discriminator`, _inline_ schemas will not be considered because they don't have
2704
+
a "name".
2704
2705
2705
2706
##### Fixed Fields
2706
2707
Field Name | Type | Description
@@ -2722,8 +2723,7 @@ MyResponseType:
2722
2723
- $ref: '#/components/schemas/Lizard'
2723
2724
```
2724
2725
2725
-
which means the payload _MUST_, by validation, match exactly one of the schemas described by `Cat`, `Dog`, or `Lizard`. In this case, a discriminator MAY act as a "hint" to shortcut validation and selection of the matching schema which may be a costly operation, depending on the complexity of the schema. We can then describe exactly which field tells us which schema to use:
2726
-
2726
+
which means the payload _MUST_, by validation, match exactly one of the schemas described by `Cat`, `Dog`, or `Lizard`. Evaluating a `oneOf` can be a costly operation, so `discriminator` MAY be used as a "hint" to improve the efficiency of validation and selection of the matching schema. The `discriminator` keyword can not change the validation result of the `oneOf`, it can only help make the evaluation more efficient and provide better error messaging. We can then describe exactly which field tells us which schema is expected to match the instance:
2727
2727
2728
2728
```yaml
2729
2729
MyResponseType:
@@ -2744,7 +2744,7 @@ The expectation now is that a property with name `petType` _MUST_ be present in
2744
2744
}
2745
2745
```
2746
2746
2747
-
Will indicate that the `Cat` schema be used in conjunction with this payload.
2747
+
Will indicate that the `Cat` schema is the alternative that is expected to match this payload.
2748
2748
2749
2749
In scenarios where the value of the discriminator field does not match the schema name or implicit mapping is not possible, an optional `mapping` definition MAY be used:
Here the discriminator _value_ of `dog` will map to the schema `#/components/schemas/Dog`, rather than the default (implicit) value of `Dog`. If the discriminator _value_ does not match an implicit or explicit mapping, no schema can be determined and validation SHOULD fail. Mapping keys MUST be string values, but tooling MAY convert response values to strings for comparison.
2765
+
Here the discriminator _value_ of `dog` will map to the schema `#/components/schemas/Dog`, rather than the default (implicit) `#/components/schemas/dog`. If the discriminator _value_ does not match an implicit or explicit mapping, no schema can be determined and validation SHOULD fail. Mapping keys MUST be string values, but tooling MAY convert response values to strings for comparison.
2766
2766
2767
-
When used in conjunction with the `anyOf` construct, the use of the discriminator can avoid ambiguity where multiple schemas may satisfy a single payload.
2767
+
When used in conjunction with the `anyOf` construct, the use of the discriminator can avoid ambiguity for serializers/deserializers where multiple schemas may satisfy a single payload.
2768
2768
2769
2769
In both the `oneOf` and `anyOf` use cases, all possible schemas MUST be listed explicitly. To avoid redundancy, the discriminator MAY be added to a parent schema definition, and all schemas comprising the parent schema in an `allOf` construct may be used as an alternate schema.
2770
2770
@@ -2773,6 +2773,11 @@ For example:
2773
2773
```yaml
2774
2774
components:
2775
2775
schemas:
2776
+
MyResponseType:
2777
+
oneOf:
2778
+
- $ref: '#/components/schemas/Cat'
2779
+
- $ref: '#/components/schemas/Dog'
2780
+
- $ref: '#/components/schemas/Lizard'
2776
2781
Pet:
2777
2782
type: object
2778
2783
required:
@@ -2810,7 +2815,12 @@ components:
2810
2815
type: boolean
2811
2816
```
2812
2817
2813
-
a payload like this:
2818
+
The `MyResponseType` schema will use the discriminator defined by the `Pet`
2819
+
schema because it is part of the `Cat`, `Dog`, and `Lizard` schemas in the
2820
+
`oneOf`. The behavior if not all schemas define a `discriminator` and they are
2821
+
not all the same is undefined.
2822
+
2823
+
Validated against the `MyResponseType` schema, a payload like this:
2814
2824
2815
2825
```json
2816
2826
{
@@ -2819,7 +2829,7 @@ a payload like this:
2819
2829
}
2820
2830
```
2821
2831
2822
-
will indicate that the `Cat` schema be used. Likewise this schema:
2832
+
will indicate that the `#/components/schemas/Cat` schema is expected to match. Likewise this payload:
2823
2833
2824
2834
```json
2825
2835
{
@@ -2828,7 +2838,7 @@ will indicate that the `Cat` schema be used. Likewise this schema:
2828
2838
}
2829
2839
```
2830
2840
2831
-
will map to `Dog` because of the definition in the `mapping` element.
2841
+
will map to `#/components/schemas/Dog` because the `dog` entry in the `mapping` element maps to `Dog` which is the schema name for `#/components/schemas/Dog`.
0 commit comments