JSON 模式条件:需要和不需要

2024-01-07

我正在尝试实现这个条件:如果存在特定属性,则需要另一个属性;但如果它不存在,则不需要另一个。

另外,在 JSON 模式中,我们可以在依赖项中使用 not 吗?

这是一个示例架构

var schema = {
    "properties": {
        "smaller": {
            "type": "number"
        },
        "larger": { "type": "number" },
        "medium":{'type':'string'},
        "bulky":{'type':'string'}
    },
    require:['smaller','larger'],
    additionalProperties:false
};

如果存在“medium”,则需要“bulky”。否则,不需要“笨重”。

这里“不需要”的意思是,如果“medium”不存在,那么bulky一定不存在。


即使不使用 JSON Schema Draft-07,也有多种方法可以达到所需的效果如果-那么-否则.

逻辑运算符和含义(draft-04 及以上)

这里的逻辑含义是:如果存在“medium”则需要“bulky”可以翻译成“中等”不存在或“笨重”是“必需”(后者暗示存在“中”),可以进一步细化为不需要“中等”或“需要”“笨重”(因为如果存在“medium”,它将满足所需的条件)。参见下面的架构:

"properties": {
  "smaller": {"type": "number"},
  "larger": { "type": "number" },
  "medium":{"type":"string"},
  "bulky":{"type":"string"}
},
"required":["smaller","larger"],
"anyOf" : [ 
  { 
    "not" : { "required" : ["medium"] }
  },
  {
    "required" : ["bulky"]
  }
],
"additionalProperties" : false

检查此处以供参考:

JSON 模式 - 如果对象*不*包含特定属性则有效 https://stackoverflow.com/questions/30515253/json-schema-valid-if-object-does-not-contain-a-particular-property

http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.7 http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.7

“anyOf” - 逻辑或,“oneOf” - 异或,“allOf” - AND,“not” - 否定,但要注意规范:

如果实例未能根据此关键字定义的架构成功验证,则该实例对该关键字有效。

Draft-06 - 依赖项 + propertyNames

最明显。我不确定您是否在问题中排除了这一点,因此将其放在这里以防万一。请注意,如果您不想简单地限制有效键,则可以使用“propertyNames”(实际上就是添加它的目的),而不是“additionalProperties”。

"properties": {
  "smaller": {"type": "number"},
  "larger": { "type": "number" },
  "medium":{"type":"string"},
  "bulky":{"type":"string"}
},
"required":["smaller","larger"],
"dependencies" : {
  "medium" : ["bulky"]
},
"propertyNames" : {
  "enum" : [
    "smaller",
    "larger",
    "medium",
    "bulky"
  ]
}

检查此处以供参考:http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.5.7 http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.5.7

Update

评论中澄清后:

对于草案 6 - 这里“不需要”意味着如果“medium”不存在,那么“bulky”一定不存在”

“不得”意味着防止大体积的存在。

我将重新表述你的条件:

1. 如果“medium”存在,则“bulky”必须存在 -> 两个键必须同时存在

2.如果“medium”不存在“bulky”must not也出现 -> 两把钥匙must not同时在场

难道“大”存在而“中”不存在吗?

否。参见 2。反之亦然(参见 1。)。布尔相等(逻辑异或的补充)。

因此,如果“笨重”存在 - 这意味着“中等”必须始终存在......这意味着两者都是required或两者不得要求(甚至不允许).

由于它是草案 06,您也可以使用“属性名称”用于定义允许的属性名称(此逻辑的一种快捷方式)。

逻辑运算符和含义(draft-06 及以上)

转换为 JSOn Schema 的正确逻辑操作如下所示:

"oneOf" : [
  { "required" : ["medium","bulky"] }, <== this schema is satisfied if both keys appear in validated instance
  {
    "allOf" : [   <== !medium ^ !bulky - due to how "not" works in schema context
      {"not" : { "required" : ["medium"] } },  
      {"not" : { "required" : ["bulky"] } },
    ]
  }
]

XOR - 要么(两者都需要)或(不需要中等且不需要大体积)。

请注意我没有做“不”:{“必需”:[“中”,“大”]}因为当仅存在这些键之一时,“必需”模式将失败,这意味着“不”将返回成功的验证结果。我们需要用德摩根定律来重新表述它:

"oneOf" : [
  { "required" : ["medium","bulky"] },
  {
    "not" : {   <=== !medium ^ !bulky = !(medium v bulky)
      "anyOf" : [
        { "required" : ["medium"] },
        { "required" : ["bulky"]  },
      ]
    }
  }
]

然而,使用“propertyNames”也能达到目的。 请参阅以下架构:

{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "properties": {
    "smaller": {"type": "number"},
    "larger": { "type": "number" },
    "medium":{"type":"string"},
    "bulky":{"type":"string"}
  },
  "required":["smaller","larger"],
  "anyOf" : [ 
    { 
       "required" : ["medium","bulky"]
    },
    {
      "propertyNames" : {
        "enum" : [
          "smaller",
          "larger"
        ]
      },
    }
  ],
  "examples" : [
    {
      "smaller" : 1,
      "larger" : 2,


    },
    {
      "smaller" : 1,
      "larger" : 2,
      "bulky" : "test",
      "medium" : ""
    },
    {
      "smaller" : 1,
      "larger" : 2,

      "medium" : ""
    },
    {
      "smaller" : 1,
      "larger" : 2,
      "bulky" : "test",

    },
  ]
}

它回答了你的问题吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON 模式条件:需要和不需要 的相关文章

随机推荐