unevaluatedProperties : Schema
unevaluatedProperties
SchemaValidates object properties that did not successfully validate against other standard object applicators.
Value |
This keyword must be set to a valid JSON Schema
Hint: Use the jsonschema metaschema and jsonschema lint commands to catch keywords set to invalid values
|
---|---|
Kind | Applicator Annotation |
Applies To | Object |
Base Dialect | 2019-09 |
Changed In | None |
Introduced In | 2019-09 |
Vocabulary | Applicator |
Specification | https://json-schema.org/draft/2019-09/draft-handrews-json-schema-02#rfc.section.9.3.2.4 |
Metaschema | https://json-schema.org/draft/2019-09/meta/unevaluated |
Official Tests | draft2019-09/unevaluatedProperties.json |
Default |
{}
|
Annotation |
Array
The set of instance property names validated by this keyword's subschema
Hint: Use the jsonschema validate command to collect annotations from the command-line
|
Affected By |
|
Affects | None |
Also See |
|
The unevaluatedProperties
keyword is a generalisation
of the additionalProperties
keyword that considers related
keywords even when they are not direct siblings of this keyword. More
specifically, this keyword is affected by occurrences of properties
, patternProperties
, additionalProperties
, and
unevaluatedProperties
itself, as long as the evaluate path that led to
unevaluatedProperties
is a prefix of the evaluate path of the others.
Given its evaluation-dependent nature, this keyword is evaluated after every other keyword from every other vocabulary.
Best Practice
There are two common use cases for this keyword, both for reducing
duplication: (1) Elegantly describing additional object properties while
declaring the properties
or
patternProperties
keywords behind conditional logic without duplicating the
additionalProperties
keyword in every possible branch. (2) Reusing helpers that consist of
the properties
,
patternProperties
, or
additionalProperties
keywords, while specialising the helpers as needed in specific locations
without having to inline the entire contents of the helper.
Digging Deeper
The JSON Schema specification defines the relationship between this keyword and the ones that affect it in terms of annotations. However, in practice, most implementations avoid the use of annotations for performance reasons, as emitting annotations and checking the annotation values of other keywords often involves significant memory allocation and complex data structure traversals.
The paper Elimination of annotation dependencies in validation for Modern JSON Schema is a comprehensive mathematical study of how applicators can be automatically re-written to avoid annotation dependencies, leading to schemas that are simpler to evaluate.
Remember that JSON Schema is a constraint-driven language.
Therefore, non-object instances successfully validate against this
keyword. If needed, make use of the type
keyword to constraint
the accepted type accordingly.
Examples
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"if": { "maxProperties": 2 },
"then": { "properties": { "foo": true } },
"else": { "patternProperties": { "^@": true } },
"unevaluatedProperties": { "type": "string" }
}
{ "foo": 1, "bar": "baz" }
{ "keyword": "/then/properties", "instance": "", "value": [ "foo" ] }
{ "keyword": "/unevaluatedProperties", "instance": "", "value": [ "bar" ] }
{ "@foo": 1, "@bar": 2, "baz": "qux" }
{ "keyword": "/else/patternProperties", "instance": "", "value": [ "@foo", "@bar" ] }
{ "keyword": "/unevaluatedProperties", "instance": "", "value": [ "baz" ] }
{ "foo": 1, "bar": 2 }
{ "@foo": 1, "@bar": 2, "baz": 3 }
{}
"Hello World"
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"properties": { "foo": true },
"$ref": "#/$defs/allow-extensions",
"unevaluatedProperties": false,
"$defs": {
"allow-extensions": {
"patternProperties": { "^@": true }
}
}
}
{ "foo": 1 }
{ "keyword": "/properties", "instance": "", "value": [ "foo" ] }
{ "foo": 1, "@bar": 2, "@baz": 3 }
{ "keyword": "/properties", "instance": "", "value": [ "foo" ] }
{ "keyword": "/$defs/allow-extensions/patternProperties", "instance": "", "value": [ "@bar", "@baz" ] }
{ "@foo": 1, "@bar": 2, "@baz": 3 }
{ "keyword": "/$defs/allow-extensions/patternProperties", "instance": "", "value": [ "@foo", "@bar", "@baz" ] }
{ "foo": 1, "bar": 2 }
{}
"Hello World"
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"allOf": [
{ "properties": { "foo": true } },
{ "unevaluatedProperties": false }
]
}
{ "foo": 1 }
{ "bar": 2 }
{}
"Hello World"
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"allOf": [ { "unevaluatedProperties": true } ],
"unevaluatedProperties": false
}
{ "foo": 1, "bar": 2, "baz": 3 }
{ "keyword": "/allOf/0/unevaluatedProperties", "instance": "", "value": [ "foo", "bar", "baz" ] }
{}
"Hello World"