JSON Schema`required`允许使用空字符串作为值

时间:2019-01-28 10:02:37

标签: json jsonschema json-schema-validator

我正在使用JSON模式模板来验证在线表单接收的数据。验证器的要求之一是,它允许根据对其他问题给出的答案来要求一些问题。

例如,如果问题是Do you want a loan?,并且用户回答yes,则问题What is the loan to be used for?的答案需要设置为必填,以便用户必须提供答案。如果答案为no,则不需要第二个问题。

我正在使用定义来定义我的问题,然后在下面的主要问题模式中引用它们。我读到,通过使用草案07中提供的if-then-else功能,我可以使用它根据其他问题的答案来设置某些问题。

在这种特定情况下,我想发生的事情是,如果用户输入问题9的答案Home improvements (General),则问题257将设置为必填且必须回答,否则将引发错误。

此刻,当我将此验证器输入https://www.jsonschemavalidator.net/时,它无法正常工作。实际发生的是,即使问题9的答案是“房屋装修(一般)”,问题257的答案也可以留空。

如何更改架构以提供我要尝试的行为?

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": {
  "properties": {
    "9": {
      "properties": {
        "answer": {
          "enum": [
            "Home improvements (General)"
          ]
        }
      },
      "required": ["answer"]
    }
  },
  "required": ["9"]
},
"then": {
  "257": {
    "properties":{
      "answer":{
        "minLength": 1
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

您的问题是您期望required检查密钥的值,而不是。

当前的草案7规范所必需:

  

如果对象实例中的每个项目都对此关键字有效   数组是实例中属性的名称。

这意味着required仅检查对象的密钥是否存在。 它与值无关。 对于字符串验证,请参阅适用于字符串的验证关键字。我怀疑您想要minLengthpattern(即正则表达式)。

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