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 模式 - 如果对象*不*包含特定属性则有效的主要内容,如果未能解决你的问题,请参考以下文章