#jsonschema
Вопрос:
У меня есть три свойства: одно, два, три.
Если указано одно из этих свойств, то два других не должны быть включены. Так что это правило взаимного исключения.
Я попытался написать это правило в сжатой форме, но, похоже, это не работает:
"oneOf": [ { "required": ["one"], "not": {"required": ["two", "three"]} }, { "required": ["two"], "not": {"required": ["one", "three"]} }, { "required": ["three"], "not": {"required": ["one", "two"]} }, ]
Это приведет к ошибке только в том случае, если все три будут указаны вместе, а не только несколько. Я почти хочу что — то вроде перечисления, но для свойств-чтобы можно было указать только одно из этого списка свойств.
Редактировать
В комментариях пользователей я удалил not
s, и это сработало, но я действительно разочарован сообщением об ошибке:
- (root): Must validate one and only one schema (oneOf) - myObj.0: Must validate one and only one schema (oneOf)
Очень не полезно. В нем ничего не говорится о том, какие свойства не проходят проверку. Есть ли способ описать это таким образом, чтобы пользователи получали ошибку, которая больше похожа:
- myObj.0: Must include one and only one of properties one, two, or three
В противном случае это как бы оставляет вас в неведении и заставляет вас просматривать фактическую схему вместо того, чтобы делать ее более очевидной.
Комментарии:
1. Просто удалите
not
s.oneOf
это уже взаимоисключающее ограничение. Вам не нужно делать эту часть вручную. Если у меня будет время позже, я отвечу на вопрос с объяснением того, почему вашиnot
s работают не так, как вы думаете.2. Я должен был знать! Но, пожалуйста, посмотрите на мою правку. Хотя это работает так, как должно, сообщение об ошибке-это облом. Есть ли способ описать это правило, которое дает моим пользователям лучшую информацию?
3. Сообщение об ошибках будет зависеть от конкретной реализации. Это лучший способ выразить это ограничение в схеме. Вы ничего не можете изменить в схеме, чтобы улучшить обмен сообщениями. Лучшее, что вы можете сделать, — это попросить, чтобы реализация улучшила их обмен сообщениями.
4. Теперь в спецификации определен стандартный формат сообщения об ошибке-вы можете запросить, чтобы реализация следовала этому формату. он включает в себя как местоположение в данных, так и местоположение в схеме, в которой произошла ошибка.
Ответ №1:
Вы можете использовать maxProperties: 1
вместе с additionalProperties: false
.
additionalProperties: false
предотвращает включение свойств, которые вы не определяете, что означает, что они должны использовать ваши, но затем maxProperties: 1
потребуется, чтобы они могли использовать только одно из них.