Проверка JSON с использованием AJV
У меня есть следующая проверка JSON
var schema = {
"type": "object",
"required": ["name", "profession"],
"properties": {
"name": { "type": "string" },
"profession": {
"oneOf": [
{ "$ref": "#/definitions/developer" },
{ "$ref": "#/definitions/manager" }
]
}
},
"definitions": {
"developer": {
"type": "object",
"properties": {
"jobLevel": { "$ref": "#/definitions/jobLevels" },
"linesOfCode": { "type": "number" },
"languages": { "enum": ["C++", "C", "Java", "VB"] }
},
"required": ["jobLevel"]
},
"manager": {
"type": "object",
"properties": {
"jobLevel": { "$ref": "#/definitions/jobLevels" },
"peopleManaged": { "type": "number" },
"responsibilities": {
"type": "array",
"minItems": 1,
"items": "string",
"uniqueItems": true
}
},
"required": ["jobLevel"]
},
"jobLevels": { "enum": ["Beginner", "Senior", "Expert"] }
}
}
Я пытаюсь проверить следующую строку JSON с приведенной выше строкой проверки.
var validate = ajv.compile(schema);
var valid = validate({
"name": "David",
"profession": {
"jobLevel": "Expert",
"linesOfCode": 50000,
"languages": "Java"
},
});
Здесь я получаю сообщение "data.profession должен соответствовать ровно одной схеме в oneOf", хотя я предоставляю ровно один экземпляр с правильными переменными экземпляра и тому подобное в данных. Не могли бы вы сказать мне, что я делаю здесь неправильно? Я, используя валидатор AJV, кстати.
Спасибо.
1 ответ
Проблема здесь в том, что объект для объекта профессии действителен в соответствии с обеими схемами внутри ключевого слова oneOf, а спецификация требует, чтобы он действовал только для одной схемы: https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#oneof
Причина того, что он действителен в соответствии с обеими схемами, заключается в том, что разрешены дополнительные свойства.
Вы можете:
- используйте anyOf (это будет быстрее в 50% случаев, поскольку остановит проверку при успешном завершении 1-й схемы)
- использование
additionalProperties
: false, чтобы запретить дополнительные поля