Схема JSON требует, чтобы значение НЕ присутствовало - PullRequest
0 голосов
/ 08 марта 2019

Я хочу выполнить проверку JSON для моей схемы, которая имеет четыре свойства:

  • group
  • partition
  • select
  • features

Если используется group или partition, то features требуется. При использовании select, features - это , запрещено . (Обратите внимание, что это похоже на случай, отличный от этого вопроса - я не хочу делать features «не обязательным», но сделайте так, чтобы вы включили его, это ошибка проверки.

Итак, у меня есть три варианта:

  • group И features
  • partition И features
  • select И НЕ features

Я закодировал их как:

"oneOf": [
  { "required": [ "group", "features" ] },
  { "required": [ "partition", "features" ] },
  { "required": [ "select" ] }
]

Но я не могу понять, как соответствующим образом заставить features быть исключенным из последнего варианта - или это вообще возможно?

Ответы [ 3 ]

1 голос
/ 08 марта 2019

Есть несколько способов смоделировать это. Если вы хотите иметь возможность разрешать дополнительные свойства, исключая только явное исключение свойства, называемого «функциями», вы можете использовать ключевое слово not:

"oneOf": [
  { "required": [ "group", "features" ] },
  { "required": [ "partition", "features" ] },
  { "required": [ "select" ], "not": { "required": ["features"] } }
]

Ключевое слово not оценивается как "допустимое", если подсхема недействительна, и оценивается как "недействительное", если подсхема действительна.

0 голосов
/ 12 марта 2019

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

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "oneOf": [
        {
            "properties": {
                "group": {
                    "type": "string"
                },
                "features": {
                    "type": "string"
                }
            },
            "required": [
                "group",
                "features"
            ]
        },
        {
            "properties": {
                "partition": {
                    "type": "string"
                },
                "features": {
                    "type": "string"
                }
            },
            "required": [
                "partition",
                "features"
            ]
        },
        {
            "properties": {
                "select": {
                    "type": "string"
                },
                "features": {
                    "not": {}
                }
            },
            "required": [
                "select"
            ]
        }
    ]
}
0 голосов
/ 08 марта 2019

Вы можете определить несколько схем любой из этих допустимых

   {
        "anyOf": [
            { "$ref": "#/definitions/group" },
            { "$ref": "#/definitions/partition" },
            { "$ref": "#/definitions/select" },
        ]
    }

, а для выбора вы можете определить схему с дополнительными значениями свойства, равными false, например,

{
  "type": "object",
  "properties": {
    "select": {"type": "string"}
  },
  "additionalProperties": false
}

Тогда вы получите ошибку, похожую наthis:

ValidationError: Дополнительные свойства не разрешены

...