假设我有一个具有四种可能属性的对象:a,b,c,d。 a和b只能一起出现(即,当且仅在出现b时出现)。如果出现a和b,则c 不能出现(即a / b和c互斥)。如果a和b没有出现,则可能出现c(但不是必须的)。 d可以与a / b,c或单独出现。除了a,b,c或d之外,不会出现任何属性。
我如何将其表达为jsonschema?我怀疑我可以使用oneOf
和required
的某种组合,但我无法弄清楚正确的咒语。
答案 0 :(得分:6)
您可以将约束短语描述为:
"a"
和"b"
都存在,且"c"
不存在"a"
和"b"
都不存在。 ("c"
可能存在也可能不存在)在第二点说“不”,有点冗长。在这里,我们使用allOf
/ not
表达了它。 (注意:您不能将它们分解为单个required
子句,因为每个子句需要单独的not
。)
{
"oneOf": [
{
"required": ["a", "b"],
"not": {"required": ["c"]}
},
{
"allOf": [
{
"not": {"required": ["a"]}
},
{
"not": {"required": ["b"]}
}
]
}
]
}
替代结构
还有另一种方式可以说“不”,实际上是再次使用oneOf
。由于您必须传递 oneOf
子句中的一个,如果其中一个条目为{}
(传递所有内容),则禁止所有其他选项。
虽然它稍微简洁一些,但阅读的可能性稍差:
{
"oneOf": [
{
"required": ["a", "b"],
"not": {"required": ["c"]}
},
{
"oneOf": [
{},
{"required": ["a"]},
{"required": ["b"]}
]
}
]
}
答案 1 :(得分:0)
另一种方法是使用模式依赖性声明:
"dependencies": {
"c": {
"allOf": [
{
"not": { "required": [ "a" ] }
},
{
"not": { "required": [ "b" ] }
}
]
},
"a": {
"allOf": [
{
"not": { "required": [ "c" ] }
},
{
"required": [ "b" ]
}
]
},
"b": {
"allOf": [
{
"not": { "required": [ "c" ] }
},
{
"required": [ "a" ]
}
]
}
}