【问题标题】:JSON schema - valid if object does *not* contain a particular propertyJSON 模式 - 如果对象*不*包含特定属性则有效
【发布时间】:2015-08-11 11:23:18
【问题描述】:

是否可以设置一个仍然允许additionalProperties 匹配的 JSON 模式(如果存在非常特殊的属性名称)?换句话说,我需要知道是否有可能与required 声明完全相反。

架构:

{
    "type": "object",
    "properties": {
        "x": { "type": "integer" }
    },
    "required": [ "x" ],
    "ban": [ "z" ] // possible?
}

匹配:

{ "x": 123 }

匹配:

{ "x": 123, "y": 456 }

匹配:

{ "x": 123, "y": 456, "z": 789 }

【问题讨论】:

    标签: json jsonschema


    【解决方案1】:

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

    {
        "type": "object",
        "properties": {
            "x": { "type": "integer" }
        },
        "required": [ "x" ],
        "not": { "required": [ "z" ] }
    }
    

    【讨论】:

    • 不需要并不意味着“必须不存在”。
    • 你是对的。我错了。无需展开解释。
    • 虽然在 JSON 模式中是正确的,但我分享了 @jruizaranguren 对逻辑的困惑。 (可悲的是,这不是 JSON 模式中的唯一位置。:/)
    • @JasonDesrosiers jruizaranguren 试图暗示的是not required 意味着even if it is there it doesn't matter。这不是您的答案的问题,而是 JSON 模式语法的意义。 "not": { "required": [ "z" ] } 在自然英语中的意思不一样..
    • @jrf 你问这个很有趣,因为我几个小时前才回答了这个问题,这不是一个常见的问题。 “怎么了required-not 部分应该回答你的问题stackoverflow.com/a/61062869/1320693
    【解决方案2】:

    有一种更简单的方法。定义如果 x 存在,它不能满足任何模式。通过简化为荒谬,x 不能存在:

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

    2020/04/16 更新:正如@Carsten 在评论中指出的那样,从草案版本 05 及更高版本开始,建议的架构可以简化如下:

    {
        "properties": {
           "x": false
        }
    }
    

    【讨论】:

    • 对我来说最方便且不混淆的答案。它的特别之处在于它与其他属性一起放置在 properties 关键字中。
    • IMO 这不是这个特定问题的答案,但它真的很好。
    • 在较新的草稿版本中,”x”: { ”not”: {} } 的简写为 ”x”: false
    • @kris_IV 你为什么不认为这回答了 OP 的问题?这正好符合“一定不存在”的标准。
    • 对于任何将它与 AJV 一起使用的人:如果您想要使用 AJV 验证器的自定义错误消息来解释为什么不允许它,那么您不能将其编织到简写语法中,但经典的“不”方法有效.
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      要指定字段不存在,您可以期望它的类型为null

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

      【讨论】:

      • 'null' 和 'undefined' 一样吗?
      【解决方案5】:

      您可以为该特定属性设置 null 类型:

       z : {
      "type": "null"
      }
      

      【讨论】:

        猜你喜欢
        • 2020-08-03
        • 2016-05-03
        • 2022-08-15
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多