相对较新的JSON模式(草案07)添加了if,then和else关键字。我无法弄清楚如何正确使用这些新关键词。到目前为止,这是我的JSON模式:
{
"type": "object",
"properties": {
"foo": {
"type": "string"
},
"bar": {
"type": "string"
}
},
"if": {
"properties": {
"foo": {
"enum": [
"bar"
]
}
}
},
"then": {
"required": [
"bar"
]
}
}
如果“ foo”属性等于“ bar”,则需要“ bar”属性。这可以按预期工作。
但是,如果“ foo”属性不存在或输入为空,那么我什么都不想要。如何做到这一点?
empty input {}.
发现错误:
对象:栏缺少必需的属性。
架构路径:#/ then / required
我使用在线验证工具:
答案 0 :(得分:5)
if
关键字表示,如果值架构的结果通过验证,则应用then
架构,否则应用else
架构。
您的架构无效,因为您需要在"foo"
架构中要求if
,否则空的JSON实例将通过if
架构的验证,因此应用{ {1}}模式,需要then
。
第二,您需要"bar"
,它可以防止架构中包含任何键,这与您要设置"propertyNames":false
来使任何内容始终无法通过验证的情况不同。
"else": false
答案 1 :(得分:0)
您不能只使用“ else”属性吗?
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": {
"enum": ["bar"]
}
}
},
"then": {
"required": ["bar"]
},
"else": {
"required": []
}
}
答案 2 :(得分:-1)
如果这些键不在同一级别,该怎么办?当A1.B1为V1即
时,C1是必需的{ “ A1”:{ “ B1”:“ V1” } }
因此,仅当A1和B1都存在且A1.B1为V1时才需要C1。