Проверка JSON-схемы AJV на основе определенного значения данных свойства, т. Е. Значений перечисления
У меня есть случай, когда мне нужно снова проверить схему json json в зависимости от значения, которое есть в одном из свойств, в терминологии схемы json свойство enum
вот джсон
{
"req":
{
user:"",
company:"",
dept:"",
class:""
reqType:"account"
}
}
reqType может принимать различные значения, такие как account, dept, classs, исходя из того, что одно из полей должно быть обязательным
я пытался использовать anyOf для того же, но он не проверяется правильно для ex - я пробовал ниже схему
{
"$id": "http://example.com/example.json",
"type": "object",
"definitions":
{},
"$schema": "http://json-schema.org/draft-07/schema#",
"properties":
{
"req":
{
"$id": "/properties/req",
"type": "object",
"properties":
{
"user":
{
"$id": "/properties/req/properties/user",
"type": "string",
"title": "The User Schema ",
"default": "",
"examples": [
"a"
]
},
"company":
{
"$id": "/properties/req/properties/company",
"type": "string",
"title": "The Company Schema ",
"default": "",
"examples": [
"b"
]
},
"dept":
{
"$id": "/properties/req/properties/dept",
"type": "string",
"title": "The Dept Schema ",
"default": "",
"examples": [
"c"
]
},
"class":
{
"$id": "/properties/req/properties/class",
"type": "string",
"title": "The Class Schema ",
"default": "",
"examples": [
"d"
]
},
"reqType":
{
"$id": "/properties/req/properties/reqType",
"type": "string",
"title": "The Reqtype Schema ",
"default": "",
"examples": [
"account"
],
"enum": [
"account", "dept", "class"
]
}
},
"required": [
"reqType"
],
"anyOf": [
{
"properties":
{
"reqType":
{
"enum": ["account"]
}
},
"required": ["user", "company"]
},
{
"properties":
{
"reqType":
{
"enum": ["dept"]
}
},
"required": ["dept"]
}]
}
},
"required": [
"req"
]
}
Кажется, что это работает нормально, когда он удовлетворяет всем условиям, но когда я проверяю, что один из случаев терпит неудачу, он выдает ошибку для другого следующим образом
[ { keyword: 'required',
dataPath: '.req',
schemaPath: '#/properties/req/anyOf/0/required',
params: { missingProperty: 'user' },
message: 'should have required property \'user\'',
schema: [ 'user', 'company' ],
parentSchema: { properties: [Object], required: [Array] },
data: { company: 'b', dept: 'c', class: 'd', reqType: 'account' } },
{ keyword: 'enum',
dataPath: '.req.reqType',
schemaPath: '#/properties/req/anyOf/1/properties/reqType/enum',
params: { allowedValues: [Array] },
message: 'should be equal to one of the allowed values',
schema: [ 'dept' ],
parentSchema: { enum: [Array] },
data: 'account' },
{ keyword: 'anyOf',
dataPath: '.req',
schemaPath: '#/properties/req/anyOf',
params: {},
message: 'should match some schema in anyOf',
schema: [ [Object], [Object] ],
parentSchema:
{ '$id': '/properties/req',
type: 'object',
properties: [Object],
required: [Array],
anyOf: [Array] },
data: { company: 'b', dept: 'c', class: 'd', reqType: 'account' } } ]
он должен был дать только ошибку для первого и должен был проверить второй случай, вместо этого он говорит, что не получил значение enum, я делаю что-то здесь неправильно
1 ответ
Ты делаешь это правильно. anyOf
Ключевое слово означает, что одна или несколько из указанных схем должны быть действительными.
Он проверяет первый и находит, что enum
ключевое слово проходит, но required
ключевое слово терпит неудачу. Поэтому эта схема не работает.
Итак, он переходит к следующей схеме и обнаруживает, что enum
ключевое слово терпит неудачу и required
ключевое слово проходит. Поэтому эта схема тоже не работает.
anyOf
Не удалось найти действительную схему, поэтому она не работает и сообщает, что ни одна из схем не прошла проверку.
Ты видишь, anyOf
не знает что enum
имеет особое значение в этой схеме. Обе схемы имеют одно ключевое слово, которое проходит, и одно, которое терпит неудачу. к anyOf
, они одинаковые.
Вот альтернатива, которая может дать вам немного лучший обмен сообщениями об ошибках. Сообщения об ошибках все еще оказываются довольно загадочными, но они сосредоточены там, где проблема действительно есть.
{
"type": "object",
"properties": {
"req": {
"type": "object",
"properties": {
"reqType": { "enum": ["account", "dept", "class"] }
},
"required": ["reqType"],
"allOf": [
{
"anyOf": [
{
"not": {
"properties": {
"reqType": { "enum": ["account"] }
}
}
},
{ "required": ["user", "company"] }
]
},
{
"anyOf": [
{
"not": {
"properties": {
"reqType": { "enum": ["dept"] }
}
}
},
{ "required": ["dept"] }
]
}
]
}
},
"required": ["req"]
}