This object contains the options for how to encode coproduct JSON schemas.
The following Scala coproduct is the candidate example. Each encoding option includes the schema that it would generate for that example.
sealed trait Pet
case class Cat(name: String) extends Pet
case class Lizard(lovesRocks: Boolean) extends Pet
- Companion:
- class
Type members
Classlikes
Strategy defining the base type schema in terms of oneOf
and the
variant schemas. The variants themselves don't refer to the base type,
but they do include the discriminator field.
Strategy defining the base type schema in terms of oneOf
and the
variant schemas. The variants themselves don't refer to the base type,
but they do include the discriminator field.
- simpler looking schemas in Swagger UI
- some OpenAPI clients don't handle
oneOf
properly
Using the Pet
example above, this strategy yields the following:
"schemas": {
"Pet": {
"oneOf": [
{ "$ref": "#/components/schemas/Cat" },
{ "$ref": "#/components/schemas/Lizard" }
],
"discriminator": {
"propertyName": "type",
"mapping": {
"Cat": "#/components/schemas/Cat",
"Lizard": "#/components/schemas/Lizard"
}
}
},
"Cat": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [ "Cat" ]
},
"name": {
"type": "string"
}
},
"required": [
"type",
"name"
]
},
"Lizard": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [ "Lizard" ]
},
"lovesRocks": {
"type": "boolean"
}
},
"required": [
"type",
"lovesRocks"
]
}
}
Strategy that extends OneOf so that each variant also refers back
to the base type schema using allOf
. This approach is sometimes
referred to in OpenAPI 3 as a way to model polymorphism.
Strategy that extends OneOf so that each variant also refers back
to the base type schema using allOf
. This approach is sometimes
referred to in OpenAPI 3 as a way to model polymorphism.
- compatible with OpenAPI clients that don't handle
oneOf
properly - more complex schemas in Swagger UI
Using the Pet
example above, this strategy yields the following:
"schemas": {
"Pet": {
"oneOf": [
{ "$ref": "#/components/schemas/Cat" },
{ "$ref": "#/components/schemas/Lizard" }
],
"discriminator": {
"propertyName": "type",
"mapping": {
"Cat": "#/components/schemas/Cat",
"Lizard": "#/components/schemas/Lizard"
}
}
},
"Cat": {
"allOf": [
{ "$ref": "#/components/schemas/Pet" },
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [ "Cat" ]
},
"name": {
"type": "string"
}
},
"required": [
"type",
"name"
]
}
]
},
"Lizard": {
"allOf": [
{ "$ref": "#/components/schemas/Pet" },
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [ "Lizard" ]
},
"lovesRocks": {
"type": "boolean"
}
},
"required": [
"type",
"lovesRocks"
]
}
]
}
}