JSON模式:根据多个属性的值,有条件地需要属性

时间:2020-10-10 08:59:09

标签: jsonschema

我想使用JSON模式验证JSON文件,应要求几个“属性” 。

示例

  • 具有属性“ A”,“ B”,“ C”和“ D”
  • 如果“ A”的值为“ foo”,则必须为C
  • 如果“ B”的值为“ foo”,则D为必填项
  • 如果“ A”和“ B”的值都为“ foo”,则C和D都是必需的
  • 否则,不需要任何操作

我在这里看到了一个非常有用的答案:https://stackoverflow.com/a/38781027/5201771->那里,作者讨论了如何解决单个属性的问题(例如,只有“ A”具有值“ foo”,因此请输入“ C”。

但是,我目前不知道如何将答案扩展到我的情况,因为有几个属性决定了结果。

示例文件

为说明起见,我提供了一些应该通过或未通过验证的文件:

应通过:

{
    "A": "bar"
    "B": "baz"
}
{
    "A": "foo"
    "C": "some value"
}
{
    "A": "bar"
    "B": "foo"
    "D": "some value"
}

应该失败:

{
    "A": "foo"
    "B": "foo"
    "D": "some value"
}

1 个答案:

答案 0 :(得分:2)

您可以通过多种方式组合条件,但通常将它们与allOf组合是最佳方法。

{
  "type": "object",
  "properties": {
    "A": {},
    "B": {},
    "C": {},
    "D": {}
  },
  "allOf": [
    { "$ref": "#/definitions/if-A-then-C-is-required" },
    { "$ref": "#/definitions/if-B-then-D-is-required" }
  ],
  "definitions": {
    "if-A-then-C-is-required": {
      "if": {
        "type": "object",
        "properties": {
          "A": { "const": "foo" }
        },
        "required": ["A"]
      },
      "then": { "required": ["C"] }
    },
    "if-B-then-D-is-required": {
      "if": {
        "type": "object",
        "properties": {
          "B": { "const": "foo" }
        },
        "required": ["B"]
      },
      "then": { "required": ["D"] }
    }
  }
}