Схема JSON OneOf каскадирования - PullRequest
2 голосов
/ 13 мая 2019

Я спрашиваю себя, могу ли я каскадировать несколько 'oneOf' или, возможно, есть лучший способ сделать мои дела действительными.

Я пытаюсь подтвердить следующее:

Использовать определение ObjectA или ObjectB как отдельных объектов или их массив

Дело 1:

Использование только определения ObjectA

{
 "X": "test"
}

Случай 2:

Использование только определения ObjectB

{
 "Y": "test"
}

Дело 3:

Использование определения ObjectA или ObjectB в массиве

[
 {
  "X": "test"
 },
 {
  "Y": "test"
 }
]

Дело 4:

Использование определения ObjectA дважды в массиве

[
 {
  "X": "test"
 },
 {
  "X": "test"
 }
]

Схема:

Я пытался использовать эту схему, IntelliSense MonacoEditor работает хорошо, но я все еще получаю сообщение об ошибке / предупреждение: «Соответствует нескольким схемам, когда требуется проверить только одну».

{
 "definitions": {
  "objectA": {
  "type": "object",
  "properties": {
   "X": {
    type: "string"
   }
  }
 },
  "objectB": {
   "type": "object",
   "properties": {
    "Y": {
     type: "string"
    }
   }
  }
 },
 "oneOf":
  [
   {
    "oneOf":
     [
      {
       "$ref": "#definitions/objectA"
      },
      {
       "$ref": "#definitions/objectB"
      }
     ]
    },
    {
     "type": "array",
     "items": 
      {
       "oneOf":
        [
         {
          "$ref": "#definitions/objectA"
         },
         {
          "$ref": "#definitions/objectB"
         }
        ]        
      }
    }
  ]
}

Ошибка / Предупреждение:

"Соответствует нескольким схемам, когда должна проверяться только одна."

1 Ответ

2 голосов
/ 13 мая 2019

Проблема в том, что ваше свойство X в objectA и свойство Y en в objectB не требуются, поэтому пустой объект, то есть {}, проверяется на обоих.

Кроме того, если вам нужен массив с objectAи objectY, чтобы быть действительным, вам нужно использовать anyOf вместо oneOf.

{
 "definitions": {
   "objectA": {
     "type": "object",
     "properties": {
       "X": {
         "type": "string"
       }
     },
     "required": ["X"]
   },
   "objectB": {
     "type": "object",
     "properties": {
       "Y": {
         "type": "string"
       }
     },
     "required": ["Y"]
   }
 },
 "oneOf":
  [
   {"$ref": "#/definitions/objectA"},
   {"$ref": "#/definitions/objectB"},
   {
     "type": "array",
     "minItems": 1,
     "items":
     {
       "anyOf":
       [
         {"$ref": "#/definitions/objectA"},
         {"$ref": "#/definitions/objectB"}
       ]        
     }
   }
  ]
}

Я добавил minItems, если вы не хотите, чтобы пустой массив проверял.

...