JSONSchema - 如果 属性 为真 - 需要另一个字段

JSONSchema - if property is true - another field is required

我想创建一个模式,当它具有 属性 has_reference 时,字段 reference 存在(如果该字段不存在,则隐式为 false)。反之亦然。该架构还有其他字段 ab.

所以这是一个有效的实例:

{
    "a": 1, "b": 2
}
{
    "a": 1, "b": 2
    "has_refernce": true, "reference": "bla"
}

但这无效:

{
    "a": 1, "b": 2
    "has_refernce": true
}
{
    "a": 1, "b": 2
    "refernce": "bla"
}

这可能吗?

编辑:我知道正确的设计是删除 "use_reference" 并使用 null "reference" 来指示引用是否存在,但我可以更改设计

如果您使用的是最新版本的架构,那么您可以利用以下 hack 来实现此目的 -

    "dependencies": {
      "has_refernce": [
         "reference"
      ],
     "reference": [
         "has_refernce"
      ]
   }

您还可以在模式中使用条件 -

"allOf" : [
   {
      "if": {
         "properties": {
            "has_refernce": {
               "const": true
            }
         }
      },
      "then": {
         "required": [
            "reference"
         ]
      }
   }
]

如果你这样重写,添加"required"关键字会更容易:

{
    "a": 1, "b": 2,
    "ref" : {
      "has_refernce": true, 
      "reference": "bla"
    }
}

您可以尝试使用 "required" 关键字,但仅限于 "ref" 内的元素。您的架构将如下所示:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "a": {
      "type": "integer"
    },
    "b": {
      "type": "integer"
    },
    "ref": {
      "type": "object",
      "properties": {
        "has_refernce": {
          "type": "boolean"
        },
        "reference": {
          "type": "string"
        }
      },
    "required" : [ "has_refernce", "reference" ]
    }
  },
  "required": [
    "a",
    "b"
  ]
}

所以只有 a 和 b 是必需的,但一旦 "ref" 被定义,"has"refernce" 和 "reference" 都将是必需的。

希望对您有所帮助。