Схема JSON if/else с необязательным свойством

#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 предложение.