Можно ли создать схему JSON с allOf (несколько, если и тогда) и $ ref? - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь создать сложную схему, которая проверит значение свойства и затем проверит в соответствии со значением этого же свойства.Мне интересно, возможно ли использовать $ ref и allOf в одной и той же схеме, и если да, то как?У меня возникли проблемы с тем, чтобы заставить это работать.Может быть важно отметить, что я использую AJV.Пожалуйста, смотрите мой код ниже

{ 
  "$ref": "#/definitions/Welcome",
  "definitions": {
    "Welcome": {
      "properties": {
        "auth": {
          "type": "string",
          "enum": ["oauth1","oauth2"]
        },
        "environment": {
          "$ref": "#/definitions/Environment"
        }
      }
    },
    "Environment": {
      "properties": {
        "dev": {
          "type": "object"
        }
      }
    },
    "Oauth1": {
      "type": "object",
      "properties": {
        "temporary_credentials": {
          "type": "string"
        }
      }
    },
    "Oauth2": {
      "type": "object",
      "properties": {
        "auth_url": {
          "type": "string"
        }
      }
    }
  },
  "allOf": [
    {
      "if": {
        "auth": {
          "const": "oauth1"
        }
      },
      "then": {
        "environment": {
          "dev": {
            "$ref": "#/definitions/Oauth1
          }
        }
      }
    },
    {
      "if": {
        "auth": {
          "const": "oauth2"
        }
      },
      "then": {
        "environment": {
          "dev": {
            "$ref": "#/definitions/Oauth2
          }
        }
      }
    }
  ]
}

Пример ввода json для проверки по этой схеме будет выглядеть примерно так

{
  "auth": "oauth1",
  "environment": {
    "dev": {
      "temporary_credentials": "xyzzy"
    }
  }
}

Я чувствую, что может бытьошибка в моих «тогда» заявлениях или просто в размещении allOf.Ошибка, которую я получу, выглядит примерно так: «$ ref: ключевые слова игнорируются в схеме по пути« # »».

1 Ответ

1 голос
/ 10 апреля 2019

В версии схемы вплоть до draft7 включительно, когда вы используете "$ref", все остальные ключевые слова на этом уровне схемы игнорируются. Вот что говорит вам ошибка: поскольку вы использовали $ref, другие ключевые слова игнорируются.

Если вы хотите использовать $ref только на корневом уровне, хитрость заключается в том, чтобы обернуть его в "allOf".

Но поскольку у вас уже есть allOf на корневом уровне, вы можете просто добавить $ref в качестве еще одной ветви allOf, и он будет работать.

Это будет выглядеть так:

"allOf": [
{
  "$ref": "#/definitions/Welcome",
},
{
  "if": {
    "auth": {
      "const": "oauth1"
    }
    etc.

Примечание: в размещенной вами схеме у вас есть две незамкнутые строки "#/definitions/Oauth1 и "#/definitions/Oauth2. Если бы это было в вашей реальной схеме, это был бы недействительный JSON.

...