有条件地需要jsonSchema属性

时间:2016-08-02 10:27:52

标签: jsonschema

在jsonSchema中,您可以使用" required"来指示定义的字段是否是必需的。属性:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "header": {
            "type": "object",
            "properties": {
                "messageName": {
                    "type": "string"
                },
                "messageVersion": {
                    "type": "string"
                }
            },
            "required": [
                "messageName",
                "messageVersion"
            ]
        }
    },
    "required": [
        "header"
    ]
}

在某些情况下,我希望 messageVersion 字段不是强制性的。有没有办法让这个领域的强制性有条件?

1 个答案:

答案 0 :(得分:168)

根据您的情况,有一些不同的方法。我可以想到有条件地要求一个领域的四种不同方式。

依赖关系

dependencies关键字是required关键字的条件变体。 dependencies中的Foreach属性,如果要验证的JSON中存在该属性,则与该键关联的模式也必须有效。 如果" foo"财产存在,然后"酒吧"属性是必需的

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "string" }
  },
  "dependencies": {
    "foo": { "required": ["bar"] }
  }
}

如果架构仅包含required关键字,则还有一个简短形式。

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "string" }
  },
  "dependencies": {
    "foo": ["bar"]
  }
}

蕴涵

如果您的条件取决于字段的值,则可以使用名为implication的布尔逻辑概念。 " A暗示B"有效意味着,如果A为真,则B也必须为真。含义也可以表示为"!A或B"。 " foo"财产不等于" bar",或" bar"属性是必需的。或者,换句话说:如果" foo"财产等于" bar",然后" bar"属性是必需的

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "string" }
  },
  "anyOf": [
    {
      "not": {
        "properties": {
          "foo": { "enum": ["bar"] }
        },
        "required": ["foo"]
      }
    },
    { "required": ["bar"] }
  ]
}

如果" foo"不等于" bar",#/anyOf/0匹配并且验证成功。如果" foo"等于" bar",#/anyOf/0失败,#/anyOf/1必须有效才能使anyOf验证成功。

枚举

如果您的条件是基于枚举,那么它更直接。的"富"可以" bar"或" baz"。如果" foo"等于" bar",然后" bar"是必须的。如果" foo"等于" baz",然后" baz"是必需的。

{
  "type": "object",
  "properties": {
    "foo": { "enum": ["bar", "baz"] },
    "bar": { "type": "string" },
    "baz": { "type": "string" }
  },
  "anyOf": [
    {
      "properties": {
        "foo": { "enum": ["bar"] }
      },
      "required": ["bar"]
    },
    {
      "properties": {
        "foo": { "enum": ["baz"] }
      },
      "required": ["baz"]
    }
  ]
}

IF-THEN-ELSE

JSON Schema (draft-07)的相对较新的添加内容会添加ifthenelse个关键字。 如果" foo"财产等于" bar",然后" bar"属性是必需的

{
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "string" }
  },
  "if": {
    "properties": {
      "foo": { "enum": ["bar"] }
    }
  },
  "then": { "required": ["bar"] }
}

编辑12/23/2017:更新了蕴涵部分,并添加了If-Then-Else部分。