Reputation: 501
Here is my revised problem and I am borrowing the same learning that I have learnt in one of the question. I have added my schema & JSON at the bottom of this question.
Criteria:
So this condition is valid:
Here the array is ["stat_data":{},{},{}]
and this condition is invalid:
JSON Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"Pencils": {
"contains": {
"properties": {
"region": {
"const": "some-pencil-region"
},
"details": {
"type": "object",
"required": [
"brand",
"year"
],
"properties": {
"brand": {
"type": "string"
},
"year": {
"type": "number"
}
}
}
}
}
},
"OilPastels": {
"contains": {
"required": [
"population"
],
"properties": {
"region": {
"const": "some-oil-pastels-region"
},
"details": {
"type": "object",
"properties": {
"size": {
"type": "number"
}
}
}
}
}
},
"containsAsia": {
"contains": {
"required": [
"population"
],
"properties": {
"region": {
"const": "asia"
},
"population": {
"type": "object",
"required": [
"year"
],
"properties": {
"year": {
"type": "number"
},
"change": {
"type": "number"
}
}
}
}
}
},
"containsEurope": {
"contains": {
"properties": {
"region": {
"const": "europe"
},
"tourist": {
"type": "number"
}
}
}
},
"containsAustralia": {
"contains": {
"properties": {
"region": {
"const": "australia"
},
"stadium": {
"type": "object",
"required": [
"year"
],
"properties": {
"year": {
"type": "number"
},
"area": {
"type": "number"
}
}
}
}
}
}
},
"type": "object",
"properties": {
"stat_data": {
"type": "array",
"minItems": 1,
"items": {
"type": "object"
},
"oneOf": [
{
"$ref": "#/definitions/Pencils"
},
{
"$ref": "#/definitions/OilPastels"
},
{
"allOf": [
{
"$ref": "#/definitions/containsAsia"
},
{
"not": {
"$ref": "#/definitions/containsEurope"
}
},
{
"not": {
"$ref": "#/definitions/containsAustralia"
}
}
]
},
{
"allOf": [
{
"$ref": "#/definitions/containsEurope"
},
{
"not": {
"$ref": "#/definitions/containsAsia"
}
},
{
"not": {
"$ref": "#/definitions/containsAustralia"
}
}
]
},
{
"allOf": [
{
"$ref": "#/definitions/containsAustralia"
},
{
"not": {
"$ref": "#/definitions/containsAsia"
}
},
{
"not": {
"$ref": "#/definitions/containsEurope"
}
}
]
}
]
}
}
}
JSON (This is failing) [I tried all my validation but all vain]
{
"stat_data":[
{
"region":"some-pencil-region",
"details":{
"brand":"Camlin",
"year": 2019
}
},
{
"region":"asia",
"population":{
"year":2018,
"change":2
}
}
]
}
10/06 Not validating the mandatory attribute LINK1
Upvotes: 1
Views: 4083
Reputation: 1817
I believe you need to use an if-then-else flow for this:
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "JSON schema generated with JSONBuddy https://www.json-buddy.com",
"properties": {
"stat_data": {
"type": "array",
"if": {
"contains": {
"type": "object",
"properties": {
"region": {
"type": "string",
"enum": [ "europe" ]
}
}
}
},
"then": {
"not": {
"contains": {
"type": "object",
"properties": {
"region": {
"type": "string",
"enum": [ "asia", "australia" ]
}
}
}
}
},
"else": {
"if": {
"contains": {
"type": "object",
"properties": {
"region": {
"type": "string",
"enum": [ "asia" ]
}
}
}
},
"then": {
"not": {
"contains": {
"type": "object",
"properties": {
"region": {
"type": "string",
"enum": [ "europe", "australia" ]
}
}
}
}
},
"else": {
"if": {
"contains": {
"type": "object",
"properties": {
"region": {
"type": "string",
"enum": [ "australia" ]
}
}
}
},
"then": {
"not": {
"contains": {
"type": "object",
"properties": {
"region": {
"type": "string",
"enum": [ "europe", "asia" ]
}
}
}
}
},
"else": {
}
}
},
"items": {
"type": "object",
"properties": {
"details": {
"$ref": "#/definitions/details"
},
"population": {
"$ref": "#/definitions/population"
},
"region": {
"enum": [ "asia", "europe", "australia", "some-pencil-region", "some-oil-pastels-region" ]
}
}
}
}
},
"definitions": {
"details": {
"type": "object",
"properties": {
"brand": {
"type": "string"
},
"year": {
"type": "integer"
}
}
},
"population": {
"type": "object",
"properties": {
"change": {
"type": "integer"
},
"year": {
"type": "integer"
}
}
}
}
}
Upvotes: 1