Проверка 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.

Спасибо.


person Chums    schedule 28.04.2016    source источник


Ответы (1)


Проблема здесь в том, что объект для объекта профессии действителен в соответствии с обеими схемами внутри ключевого слова oneOf, а спецификация требует, чтобы он действовал ровно для одной схемы: https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#oneof

Причина, по которой он действителен в соответствии с обеими схемами, заключается в том, что разрешены дополнительные свойства.

Вы можете:

  • используйте anyOf (это будет быстрее в 50% случаев, так как он остановит проверку, когда первая схема будет успешной)
  • используйте additionalProperties: false, чтобы запретить дополнительные поля
person esp    schedule 20.10.2016