Почему максимальная схема JSON не работает в allOf?

#json #jsonschema

#json #jsonschema

Вопрос:

Учитывая следующую схему JSON:

 {
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "properties": {
    "pageA": {
      "properties": {
        "a": { "type": "number" },
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "a": { "maximum": 10 }
            }
          },
          "then": {
            "properties": {
              "b": { "type": "number" },
              "c": { "type": "string" }
            }
          },
          "else": {
            "allOf": [
              {
                "if": {
                  "properties": {
                    "a": { "maximum": 20 }
                  }
                },
                "then": {
                  "properties": {
                    "e": { "type": "number" },
                    "f": { "type": "string" }
                  }
                },
                "else": {
                  "allOf": [
                    {
                      "if": {
                        "properties": {
                          "a": { "maxiumum": 30 }
                        }
                      },
                      "then": {
                        "properties": {
                          "i": { "type": "number" },
                          "j": { "type": "string" }
                        }
                      },
                      "else": {
                        "properties": {
                          "k": { "type": "number" },
                          "l": { "type": "string" }
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}
  

Я бы ожидал:

 {
    "pageA": {
      "a": 31,
      "k": "50"
    }
}
  

Чтобы сгенерировать «Недопустимый тип. Ожидаемое число, но получена строка «. но это действительно так. Я понимаю, что любые свойства, вложенные в an allOf , не могут быть перехвачены additionalProperties , и похоже, что проверка также применяется аналогичным образом.

Комментарии:

1. Ваше предложение о вложенности properties неверно и не связано с allOf applicator. additionalProperties работает только на основе значений, найденных в свойствах одного и того же объекта схемы.

Ответ №1:

С вашей схемой есть две проблемы. Первая проблема очень проста в решении. Опечатка (мы все это делали).

"a": { "maxiumum": 30 } Следует прочитать maximum .

Теперь давайте посмотрим на спецификацию, чтобы увидеть, что maximum делает…

Значение «maximum» ДОЛЖНО быть числом, представляющим инклюзивный верхний предел для числового экземпляра.

Если экземпляр является числом, то это ключевое слово проверяется, только если экземпляр меньше или точно равен «максимальному».

https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.6.2.2

Учитывая, что 30 в точности равно 30, вы запустили свое then предложение, а не свое else предложение.

Если вы хотите, чтобы значение было ЭКСКЛЮЗИВНЫМ, есть другое ключевое слово … exclusiveMaximum , которое делает именно это.

Вы можете увидеть это в действии здесь: https://jsonschema.dev/s/8Yi6e

Комментарии:

1. ДА. Мой коллега по работе только что указал на орфографическую ошибку. И это должно было быть 31, я обновил значение. Спасибо!