是否可以设置一个JSON模式,仍然允许additionalProperties
,但如果存在一个非常特定的属性名称,不匹配?换句话说,我需要知道是否有可能拥有与required
声明完全相反的内容。
模式:
{
"type": "object",
"properties": {
"x": { "type": "integer" }
},
"required": [ "x" ],
"ban": [ "z" ] // possible?
}
匹配:
{ "x": 123 }
匹配:
{ "x": 123, "y": 456 }
Do not match:
{ "x": 123, "y": 456, "z": 789 }
您想要做的可以使用not
关键字来实现。如果not
模式被验证,父模式将不被验证。
{
"type": "object",
"properties": {
"x": { "type": "integer" }
},
"required": [ "x" ],
"not": { "required": [ "z" ] }
}
有一个更简单的方法。定义如果x存在,它必须不满足任何模式。根据推理,x不可能存在:
{
"properties" : {
"x" : {
"not" : {}
}
}
}
更新2020/04/16:正如@Carsten在评论中指出的,从草案版本05及以上,建议的模式可以简化如下:
{
"properties": {
"x": false
}
}
我通过禁止通过"additionalProperties": false
附加属性,但使用patternProperties
允许任何属性名称,除了被禁止的一个,解决了这个问题。
{
"type": "object",
"properties": {
"x": { "type": "integer" }
},
"required": [ "x" ],
"patternProperties": {
"^(?!^z$).*": {}
},
"additionalProperties": false
}
要指定字段不存在,可以期望它的类型为null
。
{
"type": "object",
"properties": {
"x": { "type": "integer" },
"z": { "type": "null" }
},
"required": [ "x" ]
}
您可以为特定属性设置null类型:
z : {
"type": "null"
}