сделать атрибут перечисления jsonSchema условно обязательным с полезным сообщением об ошибке - PullRequest
1 голос
/ 09 марта 2020

Возможно, я делаю это неправильно, потому что сообщение об ошибке не помогает - даже если это "работает"

У меня есть enum (field1), который может быть aaa или bbb

Если его ааа тогда field2 должен быть обязательным. Если это не aaa, тогда field2 может быть необязательным

У меня есть это сейчас

"anyOf": [
    {
        "properties": {
            "field1": {
                "const": "aaa"
            }
        },
        "required": [
            "field2"
        ]
    },
    {
        "properties": {
            "field1": {
                "const": "bbb"
            }
        }
    }
]

Но это ошибка, которую я получаю, если field1 = aaa и field2 не указаны:

E           jsonschema.exceptions.ValidationError: 'bbb' was expected
E           
E           Failed validating 'const' in schema[1]['properties']['field1']:
E               {'const': 'bbb'}
E           
E           On instance['httpMethod']:
E               'aaa'

Я ожидал ошибку, похожую на "field2" expected because schema[1]['properties']['field1'] == bbb

Я использую это неправильно?

1 Ответ

2 голосов
/ 29 марта 2020

Если вы используете> = draft-07 , я думаю, if-then(-else) выдаст вам лучшую ошибку в вашем случае.

from jsonschema import Draft7Validator

schema = {
    "type": "object",
    "properties": {
        "field1": {
            "enum": [
                "aaa",
                "bbb"
            ]
        },
        "field2": {
            "type": "string"
        }
    },
    "if": {
        "properties": { "field1": { "const": "aaa" } }
    },
    "then": {
        "required": [ "field2" ]
    }
}

obj = {
    "field1": "aaa",
}

Draft7Validator(schema).validate(obj)

Она выдаст ошибку:

Traceback (most recent call last):
  File "error.py", line 28, in <module>
    Draft7Validator(schema).validate(obj)
  File "(...)/jsonschema/validators.py", line 353, in validate
    raise error
jsonschema.exceptions.ValidationError: 'field2' is a required property

Failed validating 'required' in schema['if']['then']:
    {'required': ['field2']}

On instance:
    {'field1': 'aaa'}
...