Json-схема проверяет наличие ключей, если другой ключ равен некоторому значению (черновик 4) - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу проверить наличие ключа json, только если другой ключ существует и равен некоторому значению.

Например, на следующем json я хочу присутствие "baz", только если "ключ" равен "foo ":

{
    "id":"myid",
    "key":"foo",
    "baz":"baz!"
}

Я могу проверить это, просто используя следующую схему json (черновик 4):

{
    "properties": 
    {
        "key":{
            "type": "string",
            "enum": ["foo", "bar"]
        },
        "baz":{
            "type": "string"
        },
        "quuz":{
            "type": "string"
        }
    },
    "anyOf":
    [
        {
            "properties":{
                "key":{ "enum": ["foo"] }
            },
            "required": ["baz"]
        },
        {
            "properties":{
                "key":{ "enum": ["bar"] }
            },
            "required": ["quuz"]
        }
    ]
}

Также допустим следующий json:

{
    "id":"myid",
    "key":"bar",
    "quuz":"quuz!"
}

Это недопустимо ("key" = "bar" требует "quuz"):

{
    "id":"myid",
    "key":"bar",
    "baz":"baz!"
}

Пока все хорошо.Теперь: мне нужно, чтобы json был действительным, даже если ключ «key» отсутствует:

{
    "id":"myid"
}

Это просто не работает с вышеуказанной схемой, потому что ключевое слово «anyOf» устанавливает поля «required».

Возможно ли получить поведение "anyOf или отсутствует ключ" ?.Draf

Любая помощь?

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете реализовать эту логику, описав две эксклюзивные подсхемы, с key:

{
  "properties":
  {
    "key":{
      "type": "string",
      "enum": ["foo", "bar"]
    },
    "baz":{
      "type": "string"
    },
    "quuz":{
      "type": "string"
    }
  },
  "oneOf":
  [
    {
      "not": {"required": ["key"]}
    },
    {
      "required": ["key"],
      "anyOf": [
      {
        "properties":{
          "key":{ "enum": ["foo"] }
        },
        "required": ["baz"]
      },
      {
        "properties":{
          "key":{ "enum": ["bar"] }
        },
        "required": ["quuz"]
      }
    ]}
  ]
}
и без
...