【问题标题】:JSON schema any of a, b and/or cJSON 模式 a、b 和/或 c 中的任何一个
【发布时间】:2017-02-04 13:03:32
【问题描述】:

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

  • 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 都已设置。

【问题讨论】:

  • 你能解释一下它是什么“不起作用”吗?
  • 我已经用一个例子更新了我的问题。

标签: json jsonschema


【解决方案1】:

我认为最好的方法是使用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"] } }
            }
        }
    }                  
}

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

【讨论】:

  • 这个我试过了,不能加a1a2,但是可以加b1b2,也可以加c1和@987654330 @.
  • 它有效。您正在使用的验证器有错误,或者您没有正确地合并到您的架构中。我可能简化了太多,不清楚该放在哪里。我将包括完整的架构以确保。
  • 我不认为是编辑。该模式允许存在a1a2。不需要并不意味着禁止。 stackoverflow.com/questions/24023536/…
  • @jruizaranguren 你是对的,不需要并不意味着禁止,但你错了,这个模式不正确。但不要相信我的话;试试看。
  • @GetOffMyLawn 这不是我第一次听说 Visual Studio 在验证 JSON 模式时存在错误。我不记得这是不是同样的问题。您可能需要采用不太优雅的解决方案来解决该错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多