Условно исключить одно свойство объекта-брата зависит от свойства другого объекта-брата в схеме JSON - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть JSON, имеющий два родственных объекта JSON, и я хотел бы иметь схему, где может удовлетворять условие, указанное ниже:

Мне нужна схема, где мне нужен атрибут 'рефери' во 2-м объектекогда нет перечисления HARD_RULES OR SOFT_RULES в 1-м объекте.

Однако, при наличии перечисления HARD_RULES OR SOFT_RULES из object1, атрибут 'referee' во 2-м объекте должен игнорироваться или отбрасываться.

Обратите внимание, что:

  1. Мне нужны и object1, и 2, когда есть правило SOFT / HARD.
  2. Мне нужен object2, когда object1 полностью недоступен, так как нет SOFT /HARD rules.
  3. 'Арбитр' обязателен в object2, если в 1-м объекте нет перечисления HARD_RULES OR SOFT_RULES.
{
    "items": [{//Object 1
        "required": ["host"],
        "properties": {
            "type": {
                "enum": ["HARD_RULES", "SOFT_RULES"],
                "type": "string"
            },
            "host": {
                "type": "string"
            }
        }
    }, {//Object 2
        "required": ["refree"],
        "properties": {
            "type": {
                "enum": ["INDOOR"],
                "type": "string"
            },
            "refree": {
                "type": "string"
            }
        }
    }]
}

Некоторые примеры:

//valid 1
{
  "items":[
  {
    "type":"HARD_RULES",
    "host": "some-host",
    "age":10
  },
  {
    "type":"INDOOR",
    "time":"some-time"
    //no referee here
  }
  ]
}

//valid 2
{
  "items":[
  {
    "type":"SOFT_RULES",
    "host": "some-host",
    "age":10
  },
  {
    "type":"INDOOR",
    "time":"some-time"
    //no referee here
  }
  ]
}

//valid 3
{
  "items":[{
    "type":"INDOOR",
    "time":"some-time",
    "refree":"Tom"  // referee here
  }]
}

//invalid
{
  "items":[
  {
    "type":"SOFT_RULES",
    "host": "some-host",
    "age":10
  },
  {
    "type":"INDOOR",
    "time":"some-time",
    "refree":"Tom"  // referee cannot be here as we have SOFT_RULES above
  }
  ]
}

1 Ответ

0 голосов
/ 26 сентября 2019

Предполагается, что вы используете здесь draf-7.

Вам нужно обернуть две подсхемы в массив oneOf.

Это означает, что ОДНА из схем должна быть действительной, а небольше чем один, а не ни один.

Вам также необходимо добавить additionalProperties: false к каждой подсхеме.

Вы были очень близки к получению этого!

...