【问题标题】:jsonSchema nested attribute conditionally requiredjsonSchema 嵌套属性有条件地需要
【发布时间】:2018-01-31 08:11:41
【问题描述】:

在jsonschema中,我们如何根据外部存在的字段值来使一些内部属性成为必需的。

在下面的例子中,

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

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

条件是,

  • propA1, propA2 如果类型为a,则为必填项,
  • 如果类型为 b,则需要 propB1 并且,
  • 如果类型为c,则propC1propC2 是必需的。

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的每个对象中指定需要的内部属性而不重复公共属性?

【问题讨论】:

    标签: jsonschema


    【解决方案1】:

    您需要在"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"]
    

    【讨论】:

      猜你喜欢
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2018-12-14
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多