JSON模式a,b和/或c中的任何一个

时间:2016-09-27 03:25:44

标签: json jsonschema

我有以下架构,我想要完成的是,我可以拥有以下一个或多个:

  • a1但不是a2,反之亦然
  • b1但不是b2,反之亦然
  • c1但不是c2,反之亦然

这是我正在尝试的json架构,但它不起作用:

{
    "type": "object",
    "properties": {
        "action": {
            "type": "object",
            "properties": {
                "a1": {},
                "a2": {},
                "b1": {},
                "b2": {},
                "c1": {},
                "c2": {}    
            },
            "anyOf": [
                {
                    "oneOf": [
                        {"required": ["a1"]},
                        {"required": ["a2"]}
                    ]
                },
                {
                    "oneOf": [
                        {"required": ["b1"]},
                        {"required": ["b2"]}
                    ]
                },
                {
                    "oneOf": [
                        {"required": ["c1"]},
                        {"required": ["c2"]}
                    ]
                }
            ]
        }
    }                  
}

它告诉我以下是有效的json:

{
    "action": {
        "a1": {},
        "b1": {},
        "b2": {}
    }    
}

这不应该有效,因为b1b2都已设置。

1 个答案:

答案 0 :(得分:0)

我认为最好的方法是使用dependencies。这就是说,如果存在“a1”,那么“a2”就不存在了(b和c等等)。

{
  "type": "object",
  "dependencies": {
    "a1": { "not": { "required": ["a2"] } },
    "b1": { "not": { "required": ["b2"] } },
    "c1": { "not": { "required": ["c2"] } }
  }
}

编辑:完整架构

{
    "type": "object",
    "properties": {
        "action": {
            "type": "object",
            "properties": {
                "a1": {},
                "a2": {},
                "b1": {},
                "b2": {},
                "c1": {},
                "c2": {}    
            },
            "dependencies": {
                "a1": { "not": { "required": ["a2"] } },
                "b1": { "not": { "required": ["b2"] } },
                "c1": { "not": { "required": ["c2"] } }
            }
        }
    }                  
}

请注意,在这种情况下声明属性是没有意义的,因为它们是空模式。我把它留在了里面以避免混淆。