#jsonschema
Вопрос:
В моей схеме есть необязательное boolean
свойство с именем prepaid. Существует также три необязательных свойства числа. Если свойство с предоплатой предоставлено и значение равно true
, то я хочу, чтобы требовались остальные три свойства. Это работает нормально, если я явно включу предоплату в JSON, но если я оставлю ее полностью, то остальные три все равно потребуются. Это моя схема.
{ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://example.com/object1638395656.json", "type": "array", "items": { "type": "object", "required": [ "id", "name" ], "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string", "minLength": 1 }, "overageRate": { "type": "number", "minimum": 0 }, "pointsPerMonth": { "type": "number", "minimum": 0 }, "prepaid": { "type": "boolean" }, }, "if": { "properties": { "prepaid": { "const": true } } }, "then": { "required": [ "pointsPerMonth", "monthlyRate", "overageRate" ] } } }
Кроме того, есть ли способ сказать, что если prepaid отсутствует или имеет значение false, то эти три свойства вообще не должны быть разрешены в JSON?
Ответ №1:
Когда в подсхеме «предоплата» отсутствует if
, результат по-прежнему остается верным: только когда «предоплата» существует и не соответствует «константе», оно будет ложным. Вам нужно добавить «обязательно» в предложение «если», чтобы оно оценивалось как ложное:
"if": { "required": [ "prepaid" ], "properties": { "prepaid": { "const": true } } }, ...
Комментарии:
1. Если я это сделаю, то валидатор скажет, что это неверно, потому что отсутствует требуемое свойство
prepaid
.2. Вы неправильно поняли. Поместите
required
его внутрьif
блока. Это не приведет к тому, что весь документ не пройдет проверку-это только приведетif
к тому, что предложение будет оценено как ложное, А затем вы поместите свою часть «что произойдет, если предложение ложно» вelse
предложение.