互斥的财产集团

时间:2015-01-27 02:58:40

标签: jsonschema

假设我有一个具有四种可能属性的对象: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?我怀疑我可以使用oneOfrequired的某种组合,但我无法弄清楚正确的咒语。

2 个答案:

答案 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" ]
       }
     ]
     }
   }