Conditional subschemas

Keywords for applying conditional subschemas

Sometimes you need to conditionally apply a subschema or to negate the validation result. The following keywords help you do that.

Validation keywords

The following keywords are supported by any instance type, and are evaluated in the presented order. All keywords are optional.

not

An instance is valid against this keyword if is not valid against the schema defined by the value of this keyword. The value of this keyword must be a valid JSON schema (object or boolean).

{
  "not": {
    "type": "string"
  }
}
Input Status
-2.3 valid
true valid
null valid
{"a": "test"} valid
[1, 2, 3] valid
"some string" invalid

Please pay attention when using not! You could unintentionally write schemas that never validate!

{
  "type": "string",
  "not": {
    "type": "string"
  }
}

if-then-else

This is a conditional structure containing three keywords: if, then and else. Every keyword value must be a valid JSON schema (object or boolean). If the if keyword is not present the then and else keywords are ignored, but when the if keyword is present at least then or else should also be present (both can be at the same time). The instance is valid against this keyword in one of the following cases:

  • the if keyword validates the instance and the then keyword also validates it
  • the if keyword doesn’t validate the instance but the else keyword validates it.

As a best practice, please place these keywords in the same order as defined here and do not add other keywords between them.

{
  "if": {
    "type": "string"
  },
  "then": {
    "minLength": 3
  },
  "else": {
    "const": 0
  }
}
Input Status
"abc" valid - string of length 3
"abcd" valid - string of length 4
0 valid
0.0 valid
"ab" valid - string of length 2
1 invalid - not a string and not 0
["abc"] invalid - not a string and not 0
{
  "if": {
    "type": "string"
  },
  "then": {
    "minLength": 3
  }
}
Input Status
"abc" valid - string of length 3
"abcd" valid - string of length 4
"ab" invalid - string of length 2
0 invalid - not a string
["abc"] invalid - not a string
{
  "if": {
    "type": "string"
  },
  "else": {
    "const": 0
  }
}
Input Status
"abc" valid
"" valid
0 invalid
-0.0 invalid
1 invalid - not a string and not 0
["abc"] invalid - not a string and not 0