oneOf : Array<Schema>

oneOf

Array<Schema>

An instance validates successfully against this keyword if it validates successfully against exactly one schema defined by this keyword’s value.

Value This keyword must be set to a non-empty array, where each item is a valid JSON Schema Hint: Use the jsonschema metaschema command to catch keywords set to invalid values
Kind Applicator
Applies To Any
Base Dialect 2020-12
Changed In None
Introduced In Draft 4
Vocabulary Applicator
Specification https://json-schema.org/draft/2020-12/json-schema-core.html#section-10.2.1.3
Metaschema https://json-schema.org/draft/2020-12/meta/applicator
Official Tests draft2020-12/oneOf.json
Default None
Annotation None
Affected By None
Affects None
Also See

The oneOf keyword restricts instances to validate against exactly one (and only one) of the given subschemas and fail on the rest. This keyword represents a logical exclusive disjunction (XOR) operation. In practice, the vast majority of schemas don’t require exclusive disjunction semantics but a simple disjunction. If you are not sure, the anyOf keyword is probably a better fit.

This keyword is equivalent to the following complex boolean construct that combines the ||, &&, and ! operators found in most programming languages:

bool valid = (A && !B && !C) || (!A && B && !C) || (!A && !B && C);

As a reference, the following boolean truth table considers the evaluation result of this keyword given 3 subschemas: A, B, and C.

oneOf Subschema A Subschema B Subschema C
Invalid Invalid Invalid Invalid
Valid Invalid Invalid Valid
Valid Invalid Valid Invalid
Invalid Invalid Valid Valid
Valid Valid Invalid Invalid
Invalid Valid Invalid Valid
Invalid Valid Valid Invalid
Invalid Valid Valid Valid

Examples

A schema that constrains object instances to require only one of the given properties Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "oneOf": [
    { "required": [ "foo" ] },
    { "required": [ "bar" ] },
    { "required": [ "baz" ] }
  ]
}
Valid A value that only matches the first subschema is valid Instance
{ "foo": 1 }
Valid A value that only matches the second subschema is valid Instance
{ "bar": 2 }
Invalid A value that matches more than one subschema is invalid Instance
{ "foo": 1, "bar": 2 }
Invalid A value that matches every subschema is invalid Instance
{ "foo": 1, "bar": 2, "baz": 3 }
Invalid A value that does not match any of the subschemas is invalid Instance
{ "extra": 4 }