Вот моя JSON-схема и JSON, как показано ниже внизу, и использующие валидатор ajv для поддержки черновика спецификации json 7.
По умолчанию объект 'science' должен быть представлен как:
//Default science object
{"type": "science", "rule": {"sciencePattern": {}}}
, где ДОЛЖНЫ быть «rule» и «sciencePattern».
Однако, если 'sciencePattern' собирается содержать другие атрибуты (в соответствии со схемой), то должна срабатывать приведенная ниже проверка:
- Если присутствует научный объект по умолчанию,тогда атрибуты "scored" в объекте "arts" должны быть ОБЯЗАТЕЛЬНЫ.
- Если атрибут NESTED "scored" массива присутствует в правиле как:
{ "type": "science", "rule":{"sciencePattern":{"marks":{"scored":[10]}}} }
, то "Забитые «атрибуты» в «искусстве» объекта НЕ ТРЕБУЮТСЯ. Другими словами, если кто-то определит атрибут «scored» с объектом «arts», проверка схемы должна пожаловаться, так как в объекте «science» имеется атрибут «scored».
// Схема JSON
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": [
"exam"
],
"properties": {
"exam": {
"type": "array",
"minItems": 1,
"items": {
"anyOf": [
{
"$ref": "#/definitions/science"
},
{
"$ref": "#/definitions/arts"
}
]
}
},
"if": {
"type": "object",
"required": [
"type",
"rule"
],
"properties": {
"type": {
"const": "science"
},
"rule": {
"type": "object",
"required": [
"sciencePattern"
],
"properties": {
"sciencePattern": {
"$ref": "#/definitions/sciencePattern"
}
}
}
}
},
"then": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"const": "arts"
},
"not": {
"required": [
"scored"
]
}
}
}
},
"definitions": {
"sciencePattern": {
"type": "object",
"required": [
"marks"
],
"properties": {
"marks": {
"type": "object",
"required": [
"scored"
],
"properties": {
"scored": {
"type": "array"
}
}
}
}
},
"science": {
"type": "object",
"properties": {
"type": {
"const": "science"
},
"rule": {
"required": [
"sciencePattern"
],
"properties": {
"sciencePattern": {
"$ref": "#/definitions/sciencePattern"
}
}
}
}
},
"arts": {
"required": [
"scored"
],
"properties": {
"type": {
"const": "arts"
},
"scored": {
"type": "number"
},
"remarks": {
"type": "string"
}
}
}
}
}
и My JSON
{
"exam": [
{
"type": "science",
"rule": {
"sciencePattern": {
"marks": {
"scored": [10]
}
}
}
},
{
"type": "arts",
"scored": 10 //This should complain as 'scored' is available above in science
}
]
}