jsonSchema 嵌套属性有条件地需要

jsonSchema nested attribute conditionally required

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

在下面的例子中,

{
  "type" : "a/b/c",
  "args": {
    "propA1": "",
    "propA2": "",
    "propB1": "",
    "propC1": "",
    "propC2": "",
    "c1": "",
    "c2": "",
    "c3": ""
  }
}

type 可以是 abcargs 始终是必需的。

条件是,

c1c2c3 总是必需的

到目前为止我所做的是,

"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"]

这里如何在不重复anyOf的每个对象中的公共属性的情况下指定内部属性所需的内容?

您需要在 "anyOf" 内部使用 "properties",就像在主架构中使用它一样。所以只需将 "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"]