Есть ли способ вызвать ошибку для любого дополнительного ключа, присутствующего в JSON, если я использую условие if-else схемы JSON? - PullRequest
2 голосов
/ 27 апреля 2020

У меня есть сценарий использования, в котором я хочу проверить наличие ключей в JSON, в зависимости от значения другого ключа.

Пример JSON -1:

{ 
  "key_name" : "value1",
  "foo" : "random_value1"
}

Пример JSON -2:

{ 
  "key_name" : "value2",
  "bar" : "random_value2"
}

Согласно этим примерам,

Правило 1. Если значением «key_name» является «value1», то only ключ «foo» должен присутствовать в JSON.

Правило 2. Если значение «key_name» равно «value2», тогда only ключ «bar» должен присутствовать в JSON.

Я написал следующую JSON схему для проверки этих JSON:

{
  "type": "object",
  "properties": {
    "key_name": {
      "type": "string",
      "enum": [
        "value1",
        "value2"
      ]
    },
    "foo": {
      "type": "string"
    },
    "bar": {
      "type": "string"
    }
  },
  "required": [
    "key_name"
  ],
  "additionalProperties": false,
  "allOf": [
    {
      "if": {
        "properties": {
          "key_name": {
            "enum": [
              "value1"
            ]
          }
        }
      },
      "then": {
        "required": [
          "foo"
        ]
      }
    },
    {
      "if": {
        "properties": {
          "key_name": {
            "enum": [
              "value2"
            ]
          }
        }
      },
      "then": {
        "required": [
          "bar"
        ]
      }
    }
  ]
}

Теперь, согласно правилам, следующие JSON недопустимы и должны вызвать ошибку.

{ 
  "key_name" : "value1",
  "foo" : "random_value1",
  "bar" : "random_value2"
}

ИЛИ

{ 
  "key_name" : "value2",
  "bar" : "random_value2",
  "foo" : "random_value"
}

Но, выше JSON Схема не может сделать это. Он только проверяет, является ли ключ «foo» / «bar» или нет, согласно значению «key_name». Не удается проверить наличие какого-либо нового ключа.

Как go об этом?

1 Ответ

1 голос
/ 27 апреля 2020

Здесь уже был дан ответ: Группы взаимоисключающих свойств .

Кроме того, здесь вы можете найти отличный обзор: атрибут jsonSchema условно обязателен .


Для ваших конкретных c примеров на ум приходят следующие подходы:

  1. Добавьте "not": { "required": ["bar"] } к вашему первому предложению then, чтобы указать, что "bar" недопустимо , И то же самое для "foo" во втором предложении then.
  2. Если всегда есть только "key_name" и разрешено еще одно свойство, вы также можете просто добавить "maxProperties": 2 в основную схему.

РЕДАКТИРОВАТЬ (для устранения альтернативного белого списка):

Другим вариантом будет определение каждой перестановки отдельно, например:

{
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "key_name": { "const": "value1" },
        "foo": { "type": "string" }
      },
      "required": ["key_name", "foo"],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "key_name": { "const": "value2" },
        "bar": { "type": "string" }
      },
      "required": ["key_name", "bar"],
      "additionalProperties": false
    }
  ]
}
...