jsonSchema 嵌套属性有条件需要

RaR*_*RaR 1 jsonschema

在jsonschema中,我们如何根据外部存在的字段值来制作所需的一些内部属性。

在下面的示例中,

{
  "type" : "a/b/c",
  "args": {
    "propA1": "",
    "propA2": "",
    "propB1": "",
    "propC1": "",
    "propC2": "",
    "c1": "",
    "c2": "",
    "c3": ""
  }
}
Run Code Online (Sandbox Code Playgroud)

type可以是abcargs总是需要的。

条件是,

  • propA1,propA2如果类型为a,则为必填项
  • propB1如果类型为band,则为必填项,
  • propC1如果类型为,则propC2需要c, 。

c1c2并且c3始终需要

到目前为止我所做的是,

"properties": {
  "type": {"enum": ["a", "b", "c"]},
  "args": {
    "type": "object",
    "properties": {
      "propA1": {"type":"string" },
      "propA2": {"type":"string" },
      "propB1": {"type":"string" },
      "propC1": {"type":"string" },
      "propC2": {"type":"string" },
      "c1": {"type":"string" },
      "c2": {"type":"string" },
      "c3": {"type":"string" }
    }
    "required": ["c1", "c2", "c3"]
  }
  "anyOf": [{
    "type": {"enum": ["a"]}
    // how to specify required for inner properties of args?
  }, {
    "type": {"enum": ["b"]}
  }, {
    "type": {"enum": ["c"]}
  }]
},
"required": ["type", "args"]
Run Code Online (Sandbox Code Playgroud)

这里我们如何指定内部属性所需的属性而不在每个对象中重复公共属性anyOf

小智 5

您需要像在主模式中使用它一样使用"properties"内部。"anyOf"因此,只需将两者都放入"type"(使用适当的单值"enum",然后将“args”放入"required"其中。您不需要重复 的其他内容"args"。它应该看起来像这样(尽管我还没有测试过)。

"properties": {
  "type": {"enum": ["a", "b", "c"]},
  "args": {
    "type": "object",
    "properties": {
      "propA1": {"type":"string" },
      "propA2": {"type":"string" },
      "propB1": {"type":"string" },
      "propC1": {"type":"string" },
      "propC2": {"type":"string" },
      "c1": {"type":"string" },
      "c2": {"type":"string" },
      "c3": {"type":"string" }
    }
    "required": ["c1", "c2", "c3"]
  }
  "anyOf": [{
    "properties": {
      "type": {"enum": ["a"]},
      "args": {
        "required": ["propA1", "propA2"]
      }
    }
  }, {
    "properties": {
      "type": {"enum": ["b"]},
      "args": {
        "required": ["propB1"]
      }
    }
  }, {
    "properties": {
      "type": {"enum": ["c"]},
      "args": {
        "required": ["propC1", "propC2"]
      }
    }
  }]
},
"required": ["type", "args"]
Run Code Online (Sandbox Code Playgroud)