Проверка 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, чтобы запретить дополнительные поля
Другие вопросы по тегам