如果另一个键等于某个值,则Json模式检查键是否存在(草案4)

如果另一个键等于某个值,则Json模式检查键是否存在(草案4),json,jsonschema,json-schema-validator,Json,Jsonschema,Json Schema Validator,我想验证一个json键的存在,只有当另一个键存在并且等于某个值时 例如,在下面的json中,我希望只有当“key”等于“foo”时才出现“baz”: 我可以使用以下json模式(草案4)对其进行验证: 以下json也是有效的: { "id":"myid", "key":"bar", "quuz":"quuz!" } 这是无效的(“键”=“条”需要“quuz”): 到目前为止,一切顺利。现在:如果“key”键丢失,我需要json也有效: { "id":"myid"

我想验证一个json键的存在,只有当另一个键存在并且等于某个值时

例如,在下面的json中,我希望只有当“key”等于“foo”时才出现“baz”:

我可以使用以下json模式(草案4)对其进行验证:

以下json也是有效的:

{
    "id":"myid",
    "key":"bar",
    "quuz":"quuz!"
}
这是无效的(“键”=“条”需要“quuz”):

到目前为止,一切顺利。现在:如果“key”键丢失,我需要json也有效:

{
    "id":"myid"
}
这不适用于上述模式,因为“anyOf”关键字设置了“required”字段

是否可能获得“任意或缺少密钥”行为?。单调的


有什么帮助吗?

您可以通过描述两个独占的子模式来实现该逻辑,有键和无键:

{
  "properties":
  {
    "key":{
      "type": "string",
      "enum": ["foo", "bar"]
    },
    "baz":{
      "type": "string"
    },
    "quuz":{
      "type": "string"
    }
  },
  "oneOf":
  [
    {
      "not": {"required": ["key"]}
    },
    {
      "required": ["key"],
      "anyOf": [
      {
        "properties":{
          "key":{ "enum": ["foo"] }
        },
        "required": ["baz"]
      },
      {
        "properties":{
          "key":{ "enum": ["bar"] }
        },
        "required": ["quuz"]
      }
    ]}
  ]
}

永远不要低估
not
的功能实际上它会起作用,因为它会触发
的两个子模式:0和2,你可以在那里快速检查,它会验证一个空的json。但是假设json:{“baz”:“BAAAZZ”}验证其中一个(oneOf)条件。这里会触发其中两个条件:{“baz”:“quoz”:“}”,即使“key”丢失。我只需要在“key”:“foo”或“bar”被忽略时触发其中一个条件。
{
    "id":"myid",
    "key":"bar",
    "baz":"baz!"
}
{
    "id":"myid"
}
{
  "properties":
  {
    "key":{
      "type": "string",
      "enum": ["foo", "bar"]
    },
    "baz":{
      "type": "string"
    },
    "quuz":{
      "type": "string"
    }
  },
  "oneOf":
  [
    {
      "not": {"required": ["key"]}
    },
    {
      "required": ["key"],
      "anyOf": [
      {
        "properties":{
          "key":{ "enum": ["foo"] }
        },
        "required": ["baz"]
      },
      {
        "properties":{
          "key":{ "enum": ["bar"] }
        },
        "required": ["quuz"]
      }
    ]}
  ]
}