Given the following JSON schema is it possible to indicate that the "name" property shall be unique (i.e. there should NOT be two items with the same "name" in the "elements" array.
{
"root":{
"type":"object",
"properties": {
"elements": {
"type":"array",
"minItems": 1,
"items":{
"type":"object",
"properties":{
"name": {
"type":"string",
"title":"Element Name",
"minLength":3,
},
"url": {
"type":"string",
"title":"Some URL"
}
}
}
}
}
}
}
I tried to use the uniqueItems keyword but it seems it was designed for simple lists of values.
No, it is not possible. From the docs, json-schema: ...a JSON based format for defining the structure of JSON data.
It is quite limited for making data values validation because it is not the purpose of the standard. Many people have asked this before because it is common to request a kind of "unique Id" feature. Unfortunately for those who need it, json-schema does not provides you with that.
So if you want to ensure uniqueness your only option is to have "name" as property keys instead of property values.
If your use-case can handle the added overhead, you can apply a transformation on the document to generate a reduced document, and then apply validation again with a separate mini schema on the reduced document.
Here are some links with information on Json transformation tools:
Handling your example case would be very straightforward in JSONata.
If refactoring the data structure is an option, the following approach may be helpful:
patternProperties
. The pattern is a regular expression. Any object that matches the pattern will be validated against the schema of the pattern-property. A pattern matching any string >= 3 characters looks like this:"....*"
, but it seems that a trailing".*"
is always implied, so"..."
works as well.minLength:3
).minItems:1
for your array), replaceminItems
byminProperties
.... resulting in the schema below:
If a document like the following (excerpt) was matching your old schema,
... a document like that (excerpt) will match the new schema: