Object type
Keywords for object type
The object
type is used for validating key-value maps (objects).
{
"type": "object"
}
Input | Status |
---|---|
{} |
valid - object with no properties |
{"prop1": "val1", "prop2": 2.5} |
invalid |
12 |
invalid - is integer/number |
"some text" |
invalid - is string |
Validation keywords
The following keywords are supported by the object
type.
All keywords are optional.
properties
An object is valid against this keyword if every property that is present in both the object and the value of this keyword, validates against the corresponding schema. The value of this keyword must be an object, where properties must contain valid json schemas (objects or booleans). Only the property names that are present in both the object and the keyword value are checked.
{
"type": "object",
"properties": {
"a": {
"type": "string"
},
"b": {
"type": "integer"
}
}
}
Input | Status |
---|---|
{"a": "str", "b": 5} |
valid |
{"a": "str"} |
valid - a is a string |
{"b": 5, "c": null} |
valid - c is an integer |
{"prop1": 0, "prop2": "str"} |
valid - both a and b properties are missing |
{"a": 1, "b": 5} |
invalid - a is not a string |
{"a": 1, "b": "text"} |
invalid - a is not string and b is not an integer |
required
An object is valid against this keyword if it contains all property names (keys) specified by the value of this keyword. The value of this keyword must be a non-empty array of strings representing property names.
{
"type": "object",
"required": ["a", "b"]
}
Input | Status |
---|---|
{"a": 1, "b": 2, "c": 3} |
valid |
{"a": 1, "b": null} |
valid |
{"a": 1, "c": 3} |
invalid - property b is missing |
{"c": 1, "d": 3} |
invalid - both a and b properties are missing |
dependencies
An object is valid against this keyword if it mets all dependencies specified by this keyword value. The value of this keyword must be an object, where property values can be:
- objects representing valid json schemas, and the whole object must match
the entire schema.
*Starting with draft 2019-09 you should usedependentSchemas
keyword instead. - arrays of strings representing property names, then the object must
contain all property names.
*Starting with draft 2019-09 you should usedependentRequired
keyword instead.
Only property names (from this keyword value) that are also present in the object are checked.
This keyword is not officially defined in draft-2019-09 and draft-2020-12, but we kept it for
backward compatibility reasons.
This keyword was split into dependentSchemas
keyword and dependentRequired
keyword.
You can disable it for draft-2020-12 by setting the keepDependenciesKeyword
option to false
.
{
"type": "object",
"dependencies": {
"a": ["b", "c"],
"c": {
"type": "object",
"properties": {
"b": {
"type": "integer"
}
}
}
}
}
Input | Status |
---|---|
{"c": 1} |
valid - b is not required |
{"c": 1, "b": 4} |
valid |
{"a": 1, "b": 4, "c": 3, "d": true} |
valid |
{"b": "str"} |
valid - no dependencies |
{"c": 1, "b": "str"} |
invalid - b must be an integer |
{"a": 1, "b": "str"} |
invalid - c is not present |
dependentSchemas
An object is valid against this keyword if it mets all dependencies specified by this keyword value. The value of this keyword must be an object, where property values can be objects representing valid json schemas, and the whole object must match the entire schema.
Only property names (from this keyword value) that are also present in the object are checked.
{
"type": "object",
"dependentSchemas": {
"c": {
"type": "object",
"properties": {
"b": {
"type": "integer"
}
}
}
}
}
Input | Status |
---|---|
{"c": 1} |
valid - b is not required |
{"c": 1, "b": 4} |
valid |
{"b": "str"} |
valid - no dependencies |
{"c": 1, "b": "str"} |
invalid - b must be an integer |
dependentRequired
An object is valid against this keyword if it mets all dependencies specified by this keyword value. The value of this keyword must be an object, where property values must be arrays of strings representing property names, and the object must contain all property names.
Only property names (from this keyword value) that are also present in the object are checked.
{
"type": "object",
"dependentRequired": {
"a": ["b", "c"]
}
}
Input | Status |
---|---|
{"a": 1, "b": 4, "c": 3, "d": true} |
valid |
{"a": 1, "b": "str"} |
invalid - c is not present |
minProperties
An object is valid against this keyword if the number of properties it contains
is greater then, or equal to, the value of this keyword. The value of this
keyword must be a non-negative integer. Using 0
as a value has no effect.
{
"type": "object",
"minProperties": 2
}
Input | Status |
---|---|
{"a": "a", "b": "b", "c": "c"} |
valid - has 3 properties |
{"a": "a", "b": "b"} |
valid - has 2 properties |
{"a": "a"} |
invalid - has a single property |
{} |
invalid - has no properties |
maxProperties
An object is valid against this keyword if the number of properties it contains
is lower then, or equal to, the value of this keyword. The value of this
keyword must be a non-negative integer. Using 0
as a value means that
the object must be empty (no properties).
{
"type": "object",
"maxProperties": 2
}
Input | Status |
---|---|
{"a": "a", "b": "b"} |
valid - has 2 properties |
{"a": "a"} |
valid - has a single property |
{} |
valid - has no properties |
{"a": "a", "b": "b", "c": "c"} |
invalid - has more than 2 properties |
propertyNames
An object is valid against this keyword if every property name (key) is valid against the value of this keyword. The value of this keyword must be a valid json schema (an object or a boolean).
Please note that the value of propertyNames
(the schema) will always
test strings.
{
"type": "object",
"propertyNames": {
"type": "string",
"minLength": 2
}
}
Input | Status |
---|---|
{"prop1": 0, "prop2": "str"} |
valid |
{} |
valid |
{"prop": 1, "a": 2} |
invalid - length of a is smaller than 2 |
patternProperties
An object is valid against this keyword if every property where a property name (key) matches a regular expression from the value of this keyword, is also valid against the corresponding schema. The value of this keyword must an object, where the keys must be valid regular expressions and the corresponding values must be valid json schemas (object or boolean).
{
"type": "object",
"patternProperties": {
"^str-": {
"type": "string"
},
"^int-": {
"type": "integer"
}
}
}
Input | Status |
---|---|
{"str-a": "a"} |
valid |
{"int-i": 2} |
valid |
{"int-i": 2, "str-a": "a", "other": [1, 2]} |
valid - other property is not matched |
{"other": "a"} |
valid - no property was match |
{"str-a": "a", "str-b": 2} |
invalid - str-b property is integer, not string |
{"str-a": "a", "int-b": 2.5} |
invalid - int-b property is float, not integer |
additionalProperties
An object is valid against this keyword if all unchecked properties are
valid against the schema defined by the value of this keyword.
Unchecked properties are the properties not checked by the properties
and
patternProperties
keywords (if a property name is not present in properties
keyword
and doesn’t match any regular expression defined by patternProperties
keyword, then
it is considered unchecked).
The value of this keyword must be a valid json schema (object or boolean).
To be more concise, if we have unchecked properties:
- if the value of this keyword is
true
, is always valid - if the value is
false
, is never valid - if the value contains an object (schema), every property must be valid against that schema.
{
"type": "object",
"additionalProperties": {
"type": "string"
}
}
Input | Status |
---|---|
{"a": "a", "b": "str"} |
valid |
{} |
valid - no properties to check |
{"str-a": "a", "int-b": 2} |
invalid - int-b is integer, not string |
{
"type": "object",
"properties": {
"a": true,
"b": true
},
"additionalProperties": false
}
Input | Status |
---|---|
{"a": "a", "b": "str"} |
valid |
{"a": 1} |
valid |
{} |
valid - no properties to check |
{"a": "a", "c": 2} |
invalid - property c is not allowed |
{"a": "a", "c": 2, "d": null} |
invalid - properties c and d are not allowed |
{
"type": "object",
"patternProperties": {
"^a": true,
"^b": true
},
"additionalProperties": false
}
Input | Status |
---|---|
{"a": "a", "b": "str"} |
valid |
{"aAA": "a", "bBB": "str"} |
valid |
{"abc": "a"} |
valid |
{} |
valid - no properties to check |
{"abc": "a", "extra": 2} |
invalid - extra starts with an e |
{"abc": "a", "Bcd": 2} |
invalid - Bcd starts with a B instead of b |
{
"type": "object",
"properties": {
"a": true,
"b": true
},
"patternProperties": {
"^extra-": {
"type": "string"
}
},
"additionalProperties": {
"type": "integer"
}
}
Input | Status |
---|---|
{"a": "a", "b": "str"} |
valid |
{"a": 1, "extra-a": "yes"} |
valid |
{"a": 1, "extra-a": "yes", "other": 1} |
valid |
{} |
valid - no properties to check |
{"a": "a", "extra": 3.5, "other": null} |
invalid - extra and other must be integers |
{"Extra-x": "x"} |
invalid - Extra-x does not start with extra- , so it must be an integer |
unevaluatedProperties
An object is valid against this keyword if every unevaluated property is valid against the schema defined by the value of this keyword.
Unevaluated properties are the properties that were not evaluated anywhere in the current schema.
This keyword can see through adjacent keywords, such as allOf
.
This keyword is hard to follow when you are dealing with complex schemas. Also, it slows down the validation process because short-circuits must be disabled for this keyword to work correctly. We do not recommend using it, unless you fully understand its behavior!
{
"type": "object",
"properties": {
"foo": {"type": "string"}
},
"allOf": [
{
"properties": {
"bar": {"type": "string"}
}
}
],
"unevaluatedProperties": false
}
Input | Status |
---|---|
{"foo": "foo", "bar": "bar"} |
valid - all evaluated |
{"foo": "foo", "bar": "bar", "baz": "baz"} |
invalid - baz is unevaluated |
You can disable unevaluatedProperties keyword by setting the allowUnevaluated
option to false
.