【问题标题】:Validating JSON data based on the value of another field根据另一个字段的值验证 JSON 数据
【发布时间】:2019-01-25 09:58:14
【问题描述】:

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

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

我想验证一下,例如,如果用户为“url”提供了任一值:

["http://creativecommons.org/licenses/by/4.0/",
 "https://creativecommons.org/licenses/by/4.0/"]

label 的值必须是以下之一:

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

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

"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 中尝试了几次不同的依赖项/属性迭代,但似乎没有任何效果。

【问题讨论】:

    标签: json validation schema jsonschema


    【解决方案1】:

    我找到了可行的方法 - "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>
    

    【讨论】:

    • 如果您使用的是 Draft-7 或更高版本,您还应该查看 if then elseconst
    • 感谢@Relequestual!它的语法是什么样的?我尝试了一些if/then 语句,但没有验证。
    • 这是一个例子:stackoverflow.com/a/51539952/89211 - 再看看你的情况,oneOf 可能比嵌套的 if / then / else 语句更可取!如果您愿意,您可以让oneOf 中的每个模式都使用ifthen,如果您觉得这样更容易阅读的话。 (我认为你也不需要在这里使用const)。
    • 如果您想进一步讨论,请随时加入 JSON Schema slack。通过网站链接。
    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 2011-09-20
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多