根据另一个字段的值验证 JSON 数据

Validating JSON data based on the value of another field

我的数据中有一个字段如下:

{
  "license":
    "url": "<some url>",
    "label": "<some label>"
}

我想验证这一点,例如,如果用户提供 "url":

的任一值
["http://creativecommons.org/licenses/by/4.0/",
 "https://creativecommons.org/licenses/by/4.0/"]

标签的值必须是以下之一:

["CC-BY", "CC BY 4.0", "CC-BY 4.0"]

并且有多个不同的标签选项,支持HTTP或者HTTPS。我尝试了以下方法,但验证失败(无法验证),而且我找不到任何关于相应值的信息,只是 if 一个字段存在,那么另一个必须存在(依赖项) .

"license": {
    "type": "object",
    "properties": {
        "oneOf": [
            {
                "url": { "enum": ["http://creativecommons.org/licenses/by/4.0/", "https://creativecommons.org/licenses/by/4.0/"] },
                "label": { "enum": ["CC-BY", "CC BY 4.0", "CC-BY 4.0"] }
            },
            {
                "url": { "enum": ["http://creativecommons.org/publicdomain/zero/1.0/", "https://creativecommons.org/publicdomain/zero/1.0/"] },
                "label": { "enum": ["CC-0", "CC0", "CC0 1.0 Universal", "CC0 1.0"] }    
            },
            {
                "url": { "enum": ["http://creativecommons.org/licenses/by/3.0/", "https://creativecommons.org/licenses/by/3.0/"] },
                "label": { "enum": ["CC-BY", "CC-BY 3.0"] } 
            } 
... <and so on>

我在 oneOf 中尝试了几次不同的 dependencies/properties 迭代,但似乎没有任何效果。

我找到了有效的方法 - "oneOf" 应该与 "properties" 齐平并将 "properties" 对象包含在其中,如下所示。

"license": {
        "type": "object",
        "properties": {
            "url": { "type": "string", "format": "uri" },
            "label": { "type": "string" },
            "logo": { "type": "string", "format": "uri" }
        },
        "required": ["url", "label"],
        "oneOf": [
            {
                "properties": {
                    "url": { "enum": ["http://creativecommons.org/licenses/by/4.0/", "https://creativecommons.org/licenses/by/4.0/"] },
                    "label": { "enum": ["CC-BY", "CC BY 4.0", "CC-BY 4.0"] }
                }
            },
            {
                "properties": {
                    "url": { "enum": ["http://creativecommons.org/publicdomain/zero/1.0/", "https://creativecommons.org/publicdomain/zero/1.0/"] },
                    "label": { "enum": ["CC-0", "CC0", "CC0 1.0 Universal", "CC0 1.0"] }
                }   
            },
            {
                "properties": {
                    "url": { "enum": ["http://creativecommons.org/licenses/by/3.0/", "https://creativecommons.org/licenses/by/3.0/"] },
                    "label": { "enum": ["CC-BY", "CC-BY 3.0"] } 
                }
            },
... <and so on>