Reputation: 35129
Is it possible to make jsonschema
to have only one of two fields.
For example, image if I want to have a JSON
with ether start_dt
or end_dt
but not both of them at the same time. like this:
{
"name": "foo",
"start_dt": "2012-10-10"
}
{
"name": "foo",
"end_dt": "2012-10-10"
}
{
"name": "foo",
"start_dt": "2012-10-10"
"end_dt": "2013-11-11"
}
What should I add to the schema:
{
"title": "Request Schema",
"type": "object",
"properties": {
"name":
{
"type": "string"
},
"start_dt":
{
"type": "string",
"format": "date"
},
"end_dt":
{
"type": "string",
"format": "date"
}
}
}
Upvotes: 7
Views: 2358
Reputation: 12873
You can express this using oneOf
. This means that the data must match exactly one of the supplied sub-schemas, but not more than one.
Combining this with required
, this schema says that instances must either define start_dt
, OR define end_dt
- but if they contain both, then it is invalid:
{
"type": "object",
"properties": {
"name": {"type": "string"},
"start_dt": {"type": "string", "format": "date"},
"end_dt": {"type": "string", "format": "date"}
},
"oneOf": [
{"required": ["start_dt"]},
{"required": ["end_dt"]}
]
}
Online demos with your three examples:
Upvotes: 14