Схема JSON `required` допускает пустую строку для значения - PullRequest
0 голосов
/ 28 января 2019

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

0 голосов
/ 29 января 2019

Ваша проблема в том, что вы ожидаете, что required проверит значение ключа, а это не так.

Требуется из текущей спецификации черновика-7:

Экземпляр объекта является допустимым для этого ключевого слова, если каждый элемент в массиве является именем свойства в экземпляре.

Это означает, что required только проверяет, существует ли ключ для объекта.Это не связано со значением.Для проверки строки см. Ключевые слова проверки, которые применимы к строкам.Я подозреваю, что вы хотите minLength или pattern (что является регулярным выражением).

https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.3

...