Схема JSON `required` допускает пустую строку для значения
Я использую шаблон схемы JSON для проверки данных, полученных онлайн-формой. Одним из требований валидатора является то, что он позволяет требовать некоторые вопросы, основываясь на ответах на другие вопросы.
Например, если вопрос Do you want a loan?
и пользователь отвечает yes
тогда ответ на вопрос What is the loan to be used for?
должен быть установлен на требуемый, так что пользователь должен предоставить ответ. Если ответ no
тогда второй вопрос не требуется.
Я использую определения для определения своих вопросов, а затем ссылаюсь на них ниже в основной схеме вопроса. Я прочитал, что с помощью функции if-then-else, представленной в draft-07, я мог бы использовать ее для задания определенных вопросов на основе ответов на другие вопросы.
В данном конкретном случае я хотел бы, чтобы пользователь вводил ответ Home improvements (General)
для вопроса 9 вопрос 257 будет установлен как обязательный, и на него ДОЛЖЕН быть дан ответ, в противном случае следует выдать ошибку.
В тот момент, когда я ввожу этот валидатор в https://www.jsonschemavalidator.net/ он не работает должным образом. Что на самом деле происходит, так это то, что ответ на вопрос 257 можно оставить пустым, даже если ответ на вопрос 9 - "Улучшения дома (общие)"
Как я могу изменить свою схему, чтобы дать поведение, которое я пытаюсь получить?
Схема JSON
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"question3-9": {
"type": "object",
"properties": {
"answer": {
"type": "string",
"enum": [
"Home improvements (General)",
"Other"
]
}
}
},
"question3-257": {
"type": "object",
"properties": {
"answer": {
"type": "string",
}
}
}
},
"type": "object",
"properties": {
"form_submission": {
"type": "object",
"properties": {
"sections": {
"type": "object",
"properties": {
"3": {
"type": "object",
"properties": {
"questions": {
"type": "object",
"properties": {
"9": {
"$ref": "#/definitions/question3-9"
},
"257": {
"$ref": "#/definitions/question3-257"
}
},
"if": {
"properties": {
"9": {
"properties": {
"answer": {
"enum": [
"Home improvements (General)"
]
}
}
}
}
},
"then": {
"required": [
"257"
]
}
}
}
}
},
"required": [
"3"
]
}
}
}
}
}
JSON для проверки:
{
"form_submission": {
"sections": {
"3": {
"questions": {
"9": {
"answer": "Home improvements (General)",
},
"257": {
"answer": "",
}
}
}
}
}
}
Обновлен If-Then
"if": {
"properties": {
"9": {
"properties": {
"answer": {
"enum": [
"Home improvements (General)"
]
}
},
"required": ["answer"]
}
},
"required": ["9"]
},
"then": {
"257": {
"properties":{
"answer":{
"minLength": 1
}
}
}
}
1 ответ
Ваша проблема здесь вы ожидаете required
проверить значение ключа, которого нет.
Требуется из текущей спецификации проекта-7:
Экземпляр объекта действителен для этого ключевого слова, если каждый элемент в массиве является именем свойства в экземпляре.
Это означает required
только проверяет, что ключ существует для объекта. Это не связано со значением. Для проверки строки см. Ключевые слова проверки, которые применимы к строкам. Я подозреваю, что вы хотите minLength
или же pattern
(который является регулярным выражением).
https://tools.ietf.org/html/draft-handrews-json-schema-validation-01