#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, я обновил значение. Спасибо!