我正在使用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
}
}
}
}
答案 0 :(得分:2)
您的问题是您期望required
检查密钥的值,而不是。
当前的草案7规范所必需:
如果对象实例中的每个项目都对此关键字有效 数组是实例中属性的名称。
这意味着required
仅检查对象的密钥是否存在。
它与值无关。
对于字符串验证,请参阅适用于字符串的验证关键字。我怀疑您想要minLength
或pattern
(即正则表达式)。
https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.3