【问题标题】:Mutually exclusive property groups互斥财产组
【发布时间】:2015-01-27 02:58:39
【问题描述】:

假设我有一个具有四个可能属性的对象:a、b、c、d。 a 和 b 只能一起出现(即,当且仅当 b 出现时,a 才会出现)。如果a和b出现,c不能出现(即a/b和c互斥)。如果 a 和 b 没有出现,c 可能会出现(但不是必须的)。 d 可以与 a/b、c 任意组合出现,也可以单独出现。除了 a、b、c 或 d 之外,任何属性都不能出现。

如何将其表达为 jsonschema?我怀疑我可以使用oneOfrequired 的某种组合,但我想不出正确的咒语。

【问题讨论】:

    标签: jsonschema


    【解决方案1】:

    您可以将约束表述为:

    • 要么:"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"]}
                ]
            }
        ]
    }
    

    【讨论】:

    • 那行得通。我最终使用了第一个变体。让我感到震惊的部分原因是我没有意识到“不需要”实际上意味着“不允许”。谢谢!
    【解决方案2】:

    另一种选择是使用架构依赖声明:

       "dependencies": {
         "c": {
           "allOf": [
           { 
             "not": { "required": [ "a" ] }
           },
           { 
             "not": { "required": [ "b" ] }
           }
         ]
         }, 
         "a": {
           "allOf": [
           { 
             "not": { "required": [ "c" ] }
           },
           { 
             "required": [ "b" ]
           }
         ]
         },
         "b": {
           "allOf": [
           { 
             "not": { "required": [ "c" ] }
           },
           { 
             "required": [ "a" ]
           }
         ]
         }
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多