繁体   English   中英

json模式中的2个oneOf:1个必需项1个可选

[英]2 oneOf in json schema: 1 required 1 optional

我有一个json模式,当我在必填字段之间使用2个oneOf进行2个选择时,该模式可以工作。 但是我不知道如何对可选字段执行同样的操作。

我的架构:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "properties": {
    "a": {
      "type": "number"
    },
    "b": {
      "type": "number"
    },
    "c": {
      "type": "number"
    },
    "d": {
      "type": "number"
    },
    "e": {
      "type": "number"
    }
  },
  "required": ["a"],
  "oneOf": [
    {"required": ["b"]},
    {"required": ["c"]}
  ],
  "oneOf": [
    {"required": ["d"]},
    {"required": ["e"]}
  ]
}

我如何进行变换以使d和e成为可选的(而永远不会同时具有两者)?

这是我的解决方案要点 ,如http://jsonschemalint.com中所示。 (非常方便的工具!)

已经定义了属性de ,并且可以任意组合允许(但不是必需)。 为了使这两个属性互斥,我们说实例必须与具有两个属性的模式not匹配:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "properties": {
    "a": {"type": "number"},
    "b": {"type": "number"},
    "c": {"type": "number"},
    "d": {"type": "number"},
    "e": {"type": "number"}
  },
  "required": ["a"],
  "oneOf": [
      {"required": ["b"]},
      {"required": ["c"]}
    ],
  "not" : {"required" : ["d","e"]}
}

这很好用,但是如果您的互斥组中有两个以上的属性,它就会变得混乱。 例如,如果我们要添加属性f并使它相对于de互斥,则必须禁止三种不同的组合:

  "not" : {
    "anyOf"{
      {"required" : ["d","e"]},
      {"required" : ["d","f"]},
      {"required" : ["e","f"]},
    }
  }

这是一个更冗长的替代方案,但可以扩展到更大的互斥属性集:

  "oneOf" : [
    {"required" : ["d"]},
    {"required" : ["e"]},
    {"required" : ["f"]},
    {
      "not" : {
        "anyOf" : [
          {"required" : ["d"]},
          {"required" : ["e"]},
          {"required" : ["f"]}
        ]
      }  
    }
  ]

添加到组中的每个属性都需要两行。

由于我们的模式现在具有两个oneOf约束,因此我们需要使用allOf将它们结合起来:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "properties": {
    "a": {"type": "number"},
    "b": {"type": "number"},
    "c": {"type": "number"},
    "d": {"type": "number"},
    "e": {"type": "number"},
    "f": {"type": "number"}
  },
  "required": ["a"],
  "allOf": [
    {
      "oneOf": [
          {"required": ["b"]},
          {"required": ["c"]}
        ]
    },
    {
      "oneOf" : [
        {"required" : ["d"]},
        {"required" : ["e"]},
        {"required" : ["f"]},
        {
          "not" : {
            "anyOf" : [
              {"required" : ["d"]},
              {"required" : ["e"]},
              {"required" : ["f"]}
            ]
          }  
        }
      ]
    }
  ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM