Как мне потребовать, чтобы в схеме json было указано только одно из набора свойств

#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 потребуется, чтобы они могли использовать только одно из них.