JSON模式-如果对象*不*包含特定属性,则有效



是否可以设置一个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"
}

最新更新