jsonSchema 嵌套属性有条件地需要
jsonSchema nested attribute conditionally required
在jsonschema中,我们如何根据外部存在的字段值来制作一些内部需要的属性。
在下面的例子中,
{
"type" : "a/b/c",
"args": {
"propA1": "",
"propA2": "",
"propB1": "",
"propC1": "",
"propC2": "",
"c1": "",
"c2": "",
"c3": ""
}
}
type
可以是 a
或 b
或 c
。 args
始终是必需的。
条件是,
如果类型为 a
、,则需要 propA1
、propA2
propB1
如果类型是 b
并且, 是必需的
如果类型为 propC1
,propC2
是必需的。
c1
、c2
和 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"]
这里如何在不重复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"]
在jsonschema中,我们如何根据外部存在的字段值来制作一些内部需要的属性。
在下面的例子中,
{
"type" : "a/b/c",
"args": {
"propA1": "",
"propA2": "",
"propB1": "",
"propC1": "",
"propC2": "",
"c1": "",
"c2": "",
"c3": ""
}
}
type
可以是 a
或 b
或 c
。 args
始终是必需的。
条件是,
-
如果类型为
propA1
、propA2
propB1
如果类型是b
并且, 是必需的
如果类型为 propC1
,propC2
是必需的。
a
、,则需要 c1
、c2
和 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"]
这里如何在不重复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"]