Reference
object
Objects are the mapping type in JSON. They map "keys" to "values".In JSON, the "keys" must always be strings. Each of these pairs isconventionally referred to as a "property".
In Python, "objects" are analogous to thedict
type. Animportant difference, however, is that while Python dictionariesmay use anything hashable as a key, in JSON all the keysmust be strings.
Try not to be confused by the two uses of the word "object" here:Python uses the wordobject
to mean the generic base class foreverything, whereas in JSON it is used only to mean a mapping fromstring keys to values.
Using non-strings as keys is invalid JSON:
Properties
The properties (key-value pairs) on an object are defined using theproperties
keyword. The value ofproperties
is an object, where eachkey is the name of a property and each value is aschema used tovalidate that property. Any property that doesn't match any of theproperty names in theproperties
keyword is ignored by this keyword.
SeeAdditional Properties andUnevaluated Properties for how to disallow properties thatdon't match any of the property names inproperties
.
For example, let's say we want to define a simple schema for an addressmade up of a number, street name and street type:
// If we provide the number in the wrong type, it is invalid:
By default, leaving out properties is valid. SeeRequired Properties.
By extension, even an empty object is valid:
By default, providing additional properties is valid:
Pattern Properties
Sometimes you want to say that, given a particular kind of propertyname, the value should match a particular schema. That's wherepatternProperties
comes in: it maps regular expressions to schemas. Ifa property name matches the given regular expression, the property valuemust validate against the corresponding schema.
Regular expressions are not anchored. This means that when defining theregular expressions forpatternProperties
, it's important to notethat the expression may match anywhere within the property name. Forexample, the regular expression"p"
will match any property name withap
in it, such as"apple"
, not just a property whose name is simply"p"
. It's therefore usually less confusing to surround the regularexpression in^...$
, for example,"^p$"
.
In this example, any properties whose names start with the prefixS_
must be strings, and any with the prefixI_
must be integers. Anyproperties that do not match either regular expression are ignored.
If the name starts withS_
, it must be a string
If the name starts withI_
, it must be an integer
This is a key that doesn't match any of the regular expressions:
Additional Properties
TheadditionalProperties
keyword is used to control the handling ofextra stuff, that is, properties whose names are not listed in theproperties
keyword or match any of the regular expressions in thepatternProperties
keyword. By default any additional properties areallowed.
The value of theadditionalProperties
keyword is a schema that will beused to validate any properties in theinstance that are not matched byproperties
orpatternProperties
. Setting theadditionalProperties
schema tofalse
means no additional properties will be allowed.
Reusing the example fromProperties, but this time settingadditionalProperties
tofalse
.
SinceadditionalProperties
isfalse
, this extra property "direction" makes the object invalid:
You can use non-boolean schemas to put more complex constraints on theadditional properties of an instance. For example, one can allowadditional properties, but only if their values are each a string:
This is valid, since the additional property's value is a string:
This is invalid, since the additional property's value is not a string:
You can useadditionalProperties
with a combination ofproperties
andpatternProperties
. In the following example, based on the examplefrompatternProperties, we add a"builtin"
property,which must be a number, and declare that all additional properties (thatare neither defined byproperties
nor matched bypatternProperties
)must be strings:
This is a key that doesn't match any of the regular expressions:
It must be a string:
Extending Closed Schemas
It's important to note thatadditionalProperties
only recognizesproperties declared in the samesubschema as itself. So,additionalProperties
can restrict you from "extending" a schemausingcombining keywords such asallOf. Inthe following example, we can see how theadditionalProperties
cancause attempts to extend the address schema example to fail.
"properties":{"type":{"enum":["residential","business"]}},"required":["type"]}
FailsadditionalProperties
. "type" is considered additional.
Failsrequired
. "type" is required.
BecauseadditionalProperties
only recognizes properties declared inthe same subschema, it considers anything other than"street_address", "city", and "state" to be additional. Combiningthe schemas withallOf doesn't change that. A workaroundyou can use is to moveadditionalProperties
to the extending schemaand redeclare the properties from the extended schema.
"properties":{"street_address":true,"city":true,"state":true,"type":{"enum":["residential","business"]}},"required":["type"],"additionalProperties":false}
Now theadditionalProperties
keyword is able to recognize all thenecessary properties and the schema works as expected. Keep reading tosee how theunevaluatedProperties
keyword solves this problem withoutneeding to redeclare properties.
Unevaluated Properties
In the previous section we saw the challenges with usingadditionalProperties
when "extending" a schema usingcombining. TheunevaluatedProperties
keyword is similartoadditionalProperties
except that it can recognize propertiesdeclared in subschemas. So, the example from the previous section can berewritten without the need to redeclare properties.
"properties":{"type":{"enum":["residential","business"]}},"required":["type"],"unevaluatedProperties":false}
unevaluatedProperties
works by collecting any properties that aresuccessfully validated when processing the schemas and using those asthe allowed list of properties. This allows you to do more complexthings like conditionally adding properties. The following exampleallows the "department" property only if the "type" of address is"business".
"if":{"type":"object","properties":{"type":{"const":"business"}},"required":["type"]},"then":{"properties":{"department":{"type":"string"}}},
"unevaluatedProperties":false}
In this schema, the properties declared in thethen
schema only countas "evaluated" properties if the "type" of the address is"business".
Required Properties
By default, the properties defined by theproperties
keyword are notrequired. However, one can provide a list of required properties usingtherequired
keyword.
Therequired
keyword takes an array of zero or more strings. Each ofthese strings must be unique.
required
must contain at least one string.In the following example schema defining a user record, we require thateach user has a name and e-mail address, but we don't mind if theydon't provide their address or telephone number:
Providing extra properties is fine, even properties not defined in the schema:
Missing the required "email" property makes the JSON document invalid:
In JSON a property with valuenull
is not equivalent to the property not being present. This fails becausenull
is not of type "string", it's of type "null"
Property names
The names of properties can be validated against a schema, irrespectiveof their values. This can be useful if you don't want to enforcespecific properties, but you want to make sure that the names of thoseproperties follow a specific convention. You might, for example, want toenforce that all names are valid ASCII tokens so they can be used asattributes in a particular programming language.
Since object keys must always be strings anyway, it is implied that theschema given topropertyNames
is always at least:
Size
The number of properties on an object can be restricted using theminProperties
andmaxProperties
keywords. Each of these must be anon-negative integer.
Need Help?
Did you find these docs helpful?
Help us make our docs great!
At JSON Schema, we value docs contributions as much as every other type of contribution!
Still Need Help?
Learning JSON Schema is often confusing, but don't worry, we are here to help!.