Как мне сделать свойство объекта JSON обязательным, основываясь на значении второго объекта JSON? - PullRequest
0 голосов
/ 24 января 2019

У меня есть представление JSON, которое я пытаюсь проверить на основе ряда правил, определенных в шаблоне. Этот шаблон определяет ряд вопросов, которые задаются пользователю. Для представления вопрос о том, требуется ли один из ответов на вопрос или нет, зависит от значения предыдущего вопроса.

Так в основном

Do you have a dog? Yes/No
What kind of dog do you have?

Действительные ответы на первый вопрос защищены с помощью enum, так что пользователь может предоставить только строки yes или no в качестве ответа на вопрос.

Если пользователь отвечает «да» на вопрос, я хочу, чтобы потребовался второй вопрос, чтобы, если второй ответ оставался пустым, когда первый ответ был yes, возникала ошибка. Если первый ответ no, пользователь может оставить второй вопрос пустым.

Ниже приведена схема JSON, которая у меня есть на данный момент для этого.

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "question3-9": {
      "type": "object",
      "properties": {
        "answer": {
          "type": "string",
          "enum": [
            "Yes", "No"
          ]
        }
      },
      "if": {
        "properties":{
          "answer": {"enum": ["Yes"]}
        }
      },
      "then": {"requried": "#/definitions/question3-257"}
    },
    "question3-257": {
      "type": "object",
      "properties": {
        "answer": {
          "type": "string",
          "minLength": 1
        }
      }
    }
  },
  "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"
                    }
                  },
                  "required": [
                    "257"
                  ]
                }
              }
            }
          },
          "required": [
            "3"
          ]
        }
      }
    }
  }
}

Я думал, что с помощью if-then-else, доступного в JSON-Schema7, я смогу задать второй вопрос как обязательный, но, похоже, он не работает так.

Вот представление, которое проверяется с использованием вышеуказанной схемы.

{
  "form_submission": {
    "sections": {
      "3": {
        "questions": {
          "9": {
            "answer": "Yes",
          },
          "257": {
            "answer": "",
          }
        }
      }
    }
  }
}

Обновленная схема JSON:

"3": {
                "type": "object",
                "properties": {
                  "questions": {
                    "type": "object",
                    "properties": {
                      "9": {
                        "$ref": "#/definitions/question3-9"
                      },
                      "257": {
                        "$ref": "#/definitions/question3-257"
                      }
                    },
                    "if": {
                      "properties":{
                        "answer": {"const": "Home improvements (General)"}
                      }
                    },
                    "then": {"required": ["257"]}
                  }
                }
              }

Подлежит проверке:

  "3": {
    "questions": {
      "9": {
        "answer": "Home improvements (General)",
      },
      "257": {
        "answer": "", //<-- This is an empty string but should be required since the answer to the abvoe question is "Home improvements (general) as defined with "answer": {"const": "Home improvements (General)"}
      }
    }

1 Ответ

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

Вы на правильном пути с ключевыми словами if / then, но требование в вашем then не совсем верно.

Ключевое слово required должно быть массивом строк, каждая из которых указывает имя свойства; в этом случае имя свойства равно "257".

Кроме того, вам нужно поместить ключевые слова if / then в свойство questions, а не в определение. Имея это в определении, вы обязаны, чтобы свойство questions.9 имело свойство 257 (questions.9.257), но вы хотите, чтобы свойство questions.257 было обязательным.

Попробуйте вместо этого:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "question3-9": {
      "type": "object",
      "properties": {
        "answer": {
          "type": "string",
          "enum": ["Yes", "No"]
        }
      }
    },
    "question3-257": {
      "type": "object",
      "properties": {
        "answer": {
          "type": "string",
          "minLength": 1
        }
      }
    }
  },
  "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":{
                      "answer": {"const": "Yes"}
                    }
                  },
                  "then": {"required": ["257"]}
                }
              }
            }
          },
          "required": ["3"]
        }
      }
    }
  }
}

Кроме того, я бы предложил использовать ключевое слово const в if. Я думаю, что это читается немного более явно.

...