Ошибка с json схема oneOf проверки ... Не удалось получить правильную проверку - PullRequest
0 голосов
/ 27 апреля 2020

Мне нужна помощь в проверке json объекта со следующим ограничением.

Мой объект имеет четыре дочерних объекта.

Действительные объекты

  • {"obj" : { "obj1" : {}, "obj2" : {} } }
  • {"obj" : { "obj1" : {}, "obj3" : {} } }
  • {"obj" : { "obj1" : {}, "obj4" : {} } }
  • {"obj" : { "obj1" : {} } }

Недопустимые объекты

  • {"obj" : { "obj1" : {}, "obj3" : {}, "obj4" : {} } }
  • {"obj" : { "obj1" : {}, "obj2" : {}, "obj4" : {} } }
  • {"obj" : { "obj1" : {}, "obj2" : {}, "obj3" : {} } }
  • {"obj" : { "obj1" : {}, "obj2" : {}, "obj3" : {}, "obj4" : {} } }

Только один из obj2, obj3, obj4 может присутствовать или ни один не должен присутствовать.

1 Ответ

0 голосов
/ 28 апреля 2020

Выражение взаимоисключающих свойств довольно просто.

"oneOf": [
  { "required": ["obj2"] },
  { "required": ["obj3"] },
  { "required": ["obj4"] }
]

Сложная часть - это ограничение "или ничего". Вы должны добавить схему к oneOf, которая запрещает все свойства. Есть несколько способов сделать это, но я думаю, что следующее является самым чистым, если не самым простым:

"oneOf": [
  {
    "properties": {
      "obj2": false,
      "obj3": false,
      "obj4": false
    }
  },
  { "required": ["obj2"] },
  { "required": ["obj3"] },
  { "required": ["obj4"] }
]

Альтернативой является использование dependencies вместо oneOf.

"dependencies": {
  "obj2": { "not": { "required": ["obj3"] } },
  "obj3": { "not": { "required": ["obj4"] } },
  "obj4": { "not": { "required": ["obj2"] } }
}

Это гораздо меньше кода и лучше масштабируется, но не сразу понятно, что он делает или как / почему он работает (он работает, я обещаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...