#python-jsonschema
Вопрос:
Для моего проекта мне нужно новое свойство для схем json. Я назвал это «isPropertyOf», и в основном я хочу, чтобы, если у меня есть это:
fruits = {
"banana": "yellow fruit",
"apple": "round fruit"
}
schema = {
"type": "object",
"properties": {
"fav_fruit": {
"type": "string",
"isPropertyOf": fruits
}
}
}
Тогда схема будет проверять только такие объекты , как {"fav_fruit":"banana"}
или {"fav_fruit":"apple"}
, но не {"fav_fruit":"salami"}
(Я знаю, что для этого самого примера использование перечисления имело бы больше смысла, но предположим, что «фрукты» также используются для других вещей, и я бы предпочел избежать избыточности)
Я прочитал документы об этом и понял, что мне нужно использовать jsonschema.validators.extend
. Я пробовал что-то в этом роде:
def is_property_of_callable(validator_instance, property_value, instance, schema):
keys = [k for k in property_value]
return instance in keys
mapping = {"isPropertyOf": is_property_of_callable}
my_validator = jsonschema.validators.extend(jsonschema.Draft7Validator, mapping)
instance = {"fav_fruit": "tobacco"}
my_validator(schema).is_valid(instance)
Я был готов увидеть, что что-то пойдет не так, но, по-видимому, валидатор не видел никаких проблем. Я попытался использовать явно неправильный экземпляр, который не принял бы даже стандартный валидатор jsonschema
my_validator(schema).is_valid({"fav_fruit": 0})
Но, по-видимому, это выглядело нормально.
Я подумал, что, возможно, то, как я добавил это свойство, было настолько нарушено, что заставляло валидатора принимать что угодно, поэтому я попробовал минимальный случай расширения валидатора:
minimal_validator = jsonschema.validators.extend(jsonschema.Draft7Validator, {})
minimal_validator(schema).is_valid(instance)
И этот тоже доволен тем, что 0 — мой любимый фрукт.
Что я здесь делаю не так? Как я могу заставить это работать?