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

M M*_*ler 13 json jsonschema

是否有可能建立一个JSON模式,它仍然允许additionalProperties若一个非常特别的属性名存在匹配吗?换句话说,我需要知道是否可能与required声明完全相反.

架构:

{
    "type": "object",
    "properties": {
        "x": { "type": "integer" }
    },
    "required": [ "x" ],
    "ban": [ "z" ] // possible?
}
Run Code Online (Sandbox Code Playgroud)

比赛:

{ "x": 123 }
Run Code Online (Sandbox Code Playgroud)

比赛:

{ "x": 123, "y": 456 }
Run Code Online (Sandbox Code Playgroud)

难道匹配:

{ "x": 123, "y": 456, "z": 789 }
Run Code Online (Sandbox Code Playgroud)

Jas*_*ers 23

您可以使用not关键字来实现您想要做的事情.如果not架构验证,则父架构将不会验证.

{
    "type": "object",
    "properties": {
        "x": { "type": "integer" }
    },
    "required": [ "x" ],
    "not": { "required": [ "z" ] }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然在 JSON 模式中是正确的,但我分享了 @jruizaranguren 对逻辑的困惑。(遗憾的是,这不是 JSON 模式中唯一的地方。:/) (5认同)
  • 不需要并不意味着“不能出现”。 (4认同)
  • 你是对的。我错了。无需展开解释。 (3认同)
  • @jrf你问这个问题很有趣,因为我几个小时前刚刚回答了这个问题,这不是一个常见的问题。“‘required’-‘not’ 部分应该回答您的问题 /sf/answers/4274400861/ (3认同)
  • @jruizaranguren,你是想说这个答案是错误的吗?如果不清楚为什么这个模式回答了问题,我可以扩展我的解释。 (2认同)

jru*_*ren 13

有一种更简单的方法.定义如果x存在则它不能满足任何模式.通过减少到荒谬x不能存在:

{
    "properties" : {
        "x" : {
            "not" : {}

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在较新的草案版本中,“x”: { “not”: {} }` 的简写形式为“x”: false。 (2认同)

M M*_*ler 5

我通过禁止其他属性解决了这个问题,"additionalProperties": false但使用patternProperties允许除被禁止的属性名称之外的任何属性名称。

{
    "type": "object",
    "properties": {
        "x": { "type": "integer" }
    },
    "required": [ "x" ],
    "patternProperties": {
        "^(?!^z$).*": {}
    },
    "additionalProperties": false
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*art 5

要指定不存在字段,您可以预期其类型为null

{
    "type": "object",
    "properties": {
        "x": { "type": "integer" },
        "z": { "type": "null" }

    },
    "required": [ "x" ]
}
Run Code Online (Sandbox Code Playgroud)

  • 那么“null”和“undefined”一样吗? (4认同)