1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
from dataclasses import dataclass
from apischema import deserialize, discriminator, serialize
from apischema.json_schema import deserialization_schema
@discriminator("type")
class Pet:
pass
@dataclass
class Cat(Pet):
pass
@dataclass
class Dog(Pet):
pass
data = {"type": "Dog"}
assert deserialize(Pet, data) == deserialize(Cat | Dog, data) == Dog()
assert serialize(Pet, Dog()), serialize(Cat | Dog, Dog()) == data
assert (
deserialization_schema(Pet)
== deserialization_schema(Cat | Dog)
== {
"$schema": "http://json-schema.org/draft/2020-12/schema#",
"oneOf": [{"$ref": "#/$defs/Cat"}, {"$ref": "#/$defs/Dog"}],
"$defs": {
"Pet": {
"type": "object",
"required": ["type"],
"properties": {"type": {"type": "string"}},
"discriminator": {"propertyName": "type"},
},
"Cat": {"allOf": [{"$ref": "#/$defs/Pet"}, {"type": "object"}]},
"Dog": {"allOf": [{"$ref": "#/$defs/Pet"}, {"type": "object"}]},
},
}
)
|