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

Posted

技术标签:

【中文标题】JSON 模式 - 如果对象*不*包含特定属性则有效【英文标题】:JSON schema - valid if object does *not* contain a particular property 【发布时间】: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 

【问题讨论】:

【参考方案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 部分应该回答你的问题***.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"

【讨论】:

以上是关于JSON 模式 - 如果对象*不*包含特定属性则有效的主要内容,如果未能解决你的问题,请参考以下文章

如何检查对象数组中这些对象中的特定属性?反应

在特定模式后重命名 JSON 键

将 JSON 对象转换为特定类型

创建对象----原型模式

类似字典的 JSON 模式

Java 只返回超类的属性