Я использую шаблон схемы 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
}
}
}
}