Skip to content

Commit 218b970

Browse files
authored
Merge pull request #3885 from handrews/disc-of-320
Clarify discriminator + oneOf/anyOf/allOf usage (3.2.0 port of #3846)
2 parents e723bf9 + cccd70b commit 218b970

File tree

1 file changed

+33
-14
lines changed

1 file changed

+33
-14
lines changed

versions/3.2.0.md

+33-14
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ An OpenAPI document MAY be made up of a single document or be divided into multi
153153

154154
It is RECOMMENDED that the root OpenAPI document be named: `openapi.json` or `openapi.yaml`.
155155

156+
#### <a name="resolvingImplicitConnections"></a>Resolving Implicit Connections
157+
156158
### <a name="dataTypes"></a>Data Types
157159

158160
Data types in the OAS are based on the types supported by the [JSON Schema Specification Draft 2020-12](https://tools.ietf.org/html/draft-bhutton-json-schema-00#section-4.2.1).
@@ -2671,7 +2673,7 @@ components:
26712673
]
26722674
},
26732675
"Cat": {
2674-
"description": "A representation of a cat. Note that `Cat` will be used as the discriminator value.",
2676+
"description": "A representation of a cat. Note that `Cat` will be used as the discriminating value.",
26752677
"allOf": [
26762678
{
26772679
"$ref": "#/components/schemas/Pet"
@@ -2698,7 +2700,7 @@ components:
26982700
]
26992701
},
27002702
"Dog": {
2701-
"description": "A representation of a dog. Note that `Dog` will be used as the discriminator value.",
2703+
"description": "A representation of a dog. Note that `Dog` will be used as the discriminating value.",
27022704
"allOf": [
27032705
{
27042706
"$ref": "#/components/schemas/Pet"
@@ -2740,7 +2742,7 @@ components:
27402742
required:
27412743
- name
27422744
- petType
2743-
Cat: # "Cat" will be used as the discriminator value
2745+
Cat: # "Cat" will be used as the discriminating value
27442746
description: A representation of a cat
27452747
allOf:
27462748
- $ref: '#/components/schemas/Pet'
@@ -2756,7 +2758,7 @@ components:
27562758
- aggressive
27572759
required:
27582760
- huntingSkill
2759-
Dog: # "Dog" will be used as the discriminator value
2761+
Dog: # "Dog" will be used as the discriminating value
27602762
description: A representation of a dog
27612763
allOf:
27622764
- $ref: '#/components/schemas/Pet'
@@ -2887,19 +2889,38 @@ components:
28872889
28882890
#### <a name="discriminatorObject"></a>Discriminator Object
28892891
2890-
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.
2891-
2892-
When using the discriminator, _inline_ schemas will not be considered.
2892+
When request bodies or response payloads may be one of a number of different schemas, a Discriminator Object gives a hint about the expected schema of the document.
2893+
This hint can be used to aid in serialization, deserialization, and validation.
2894+
The Discriminator Object does this by implicitly or explicitly associating the possible values of a named property with alternative schemas.
28932895
28942896
##### Fixed Fields
28952897
Field Name | Type | Description
28962898
---|:---:|---
2897-
<a name="propertyName"></a>propertyName | `string` | **REQUIRED**. The name of the property in the payload that will hold the discriminator value.
2898-
<a name="discriminatorMapping"></a> mapping | Map[`string`, `string`] | An object to hold mappings between payload values and schema names or references.
2899+
<a name="propertyName"></a>propertyName | `string` | **REQUIRED**. The name of the property in the payload that will hold the discriminating value. This property SHOULD be required in the payload schema, as the behavior when the property is absent is undefined.
2900+
<a name="discriminatorMapping"></a> mapping | Map[`string`, `string`] | An object to hold mappings between payload values and schema names or URI references.
28992901

29002902
This object MAY be extended with [Specification Extensions](#specificationExtensions).
29012903

2902-
The discriminator object is legal only when using one of the composite keywords `oneOf`, `anyOf`, `allOf`. Note that because the discriminating property's value is used as a component name and/or as the key in the `mapping` object, the behavior of any value that is not a string is undefined.
2904+
##### Conditions for Using the Discriminator Object
2905+
The Discriminator Object is legal only when using one of the composite keywords `oneOf`, `anyOf`, `allOf`.
2906+
In both the `oneOf` and `anyOf` use cases, where those keywords are adjacent to `discriminator`, all possible schemas MUST be listed explicitly.
2907+
To avoid redundancy, the discriminator MAY be added to a parent schema definition, and all schemas building on the parent schema via an `allOf` construct may be used as an alternate schema.
2908+
2909+
The behavior of any configuration of `oneOf`, `anyOf`, `allOf` and `discriminator` that is not described above is undefined.
2910+
2911+
##### Options for Mapping Values to Schemas
2912+
The value of the property named in `propertyName` is used as the name of the associated schema under the [Components Object](#componentsObject), _unless_ a `mapping` is present for that value.
2913+
The `mapping` entry maps a specific property value to either a different schema component name, or to a schema identified by a URI.
2914+
When using implicit or explicit schema component names, inline `oneOf` or `anyOf` subschemas are not considered.
2915+
The behavior of a `mapping` value that is both a valid schema name and a valid relative URI reference is implementation-defined, but it is RECOMMENDED that it be treated as a schema name.
2916+
To ensure that an ambiguous value (e.g. `"foo"`) is treated as a relative URI reference by all implementations, authors MUST prefix it with the `"."` path segment (e.g. `"./foo"`).
2917+
2918+
Mapping keys MUST be string values, but tooling MAY convert response values to strings for comparison.
2919+
However, the exact nature of such conversions are implementation-defined.
2920+
2921+
##### <a name="discriminatorExamples"></a>Examples
2922+
2923+
For these examples, assume all schemas are in the entry OpenAPI document; for handling of `discriminator` in referenced documents see [Resolving Implicit Connections](#resolvingImplicitConnections).
29032924

29042925
In OAS 3.0, a response payload MAY be described to be exactly one of any number of types:
29052926

@@ -2951,13 +2972,11 @@ MyResponseType:
29512972
monster: https://gigantic-server.com/schemas/Monster/schema.json
29522973
```
29532974

2954-
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.
2975+
Here the discriminating value of `dog` will map to the schema `#/components/schemas/Dog`, rather than the default (implicit) value of `#/components/schemas/dog`. If the discriminating value does not match an implicit or explicit mapping, no schema can be determined and validation SHOULD fail.
29552976

29562977
When used in conjunction with the `anyOf` construct, the use of the discriminator can avoid ambiguity where multiple schemas may satisfy a single payload.
29572978

2958-
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.
2959-
2960-
For example:
2979+
This example shows the `allOf` usage, which avoids needing to reference all child schemas in the parent:
29612980

29622981
```yaml
29632982
components:

0 commit comments

Comments
 (0)