如何在json架构中使用if,then,else条件?

时间:2018-07-26 13:05:45

标签: jsonschema

相对较新的JSON模式(草案07)添加了if,then和else关键字。我无法弄清楚如何正确使用这些新关键词。到目前为止,这是我的JSON模式:

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

如果“ foo”属性等于“ bar”,则需要“ bar”属性。这可以按预期工作。

但是,如果“ foo”属性不存在或输入为空,那么我什么都不想要。如何做到这一点?

empty input {}.

发现错误:
        对象:栏缺少必需的属性。     架构路径:#/ then / required

我使用在线验证工具:

https://www.jsonschemavalidator.net/

3 个答案:

答案 0 :(得分:5)

if关键字表示,如果值架构的结果通过验证,则应用then架构,否则应用else架构。

您的架构无效,因为您需要在"foo"架构中要求if,否则空的JSON实例将通过if架构的验证,因此应用{ {1}}模式,需要then

第二,您需要"bar",它可以防止架构中包含任何键,这与您要设置"propertyNames":false来使任何内容始终无法通过验证的情况不同。

"else": false

答案 1 :(得分:0)

您不能只使用“ else”属性吗?

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

答案 2 :(得分:-1)

如果这些键不在同一级别,该怎么办?当A1.B1为V1即

时,C1是必需的

{ “ A1”:{       “ B1”:“ V1”      } }

因此,仅当A1和B1都存在且A1.B1为V1时才需要C1。