【问题标题】:How to use oneOf in JSON Schema to ensure that certain fields of a JSON file are not required如何在 JSON Schema 中使用 oneOf 来确保 JSON 文件的某些字段不是必需的
【发布时间】:2015-08-01 16:08:07
【问题描述】:

我有一个定义疾病通知数据的 JSON 模式。就我而言,我想存储疾病的数据和患者的住院数据。如果感染的病人住院了("hospitalized ": 1)我也需要写医院的名字,但是如果病人没有住院("hospitalized": 2)我不需要医院的名字。这是我的 JSON 架构

{
 "$schema":"http://json-schema.org/draft-04/schema#",
 "title": "Notification",
 "description": "Information about disease notification",
 "type": "object",

 "properties":{

     "classification":{
         "enum":[1,2,3,4]
     },

     "evolution":{
        "enum":[1,2]
    },

    "hospitalization":{

        "description":"Patient hospitalization data",
        "type":"object",

        "oneOf":[

        {"$ref":"#/definitions/hospitalized_schema"},
        {"$ref":"#/definitions/not_hospitalized_schema"}

        ]
    }
},

"definitions":{

    "hospitalized_schema:":{

        "type":"object",

        "properties":{

            "hospitalized":{

                "enum":[1]

            },

            "hospital":{

                "description":"Hospital name",
                "type":"string"
            }

        },

        "required":["hospitalized","hospital"]
    },

    "not_hospitalized_schema":{

        "type":"object",

        "properties":{

            "hospitalized":{
                "enum":[2]
            }
        },

        "required":["hospitalized"]
    }   
},

"required":["classification","evolution","hospitalization"]
}

JSON 架构已在网站 JSON Schema Lint 上得到验证。但我无法验证以下 JSON 文件:

{ 
    "classification":3,
    "evolution":2,
    "hospitalization": {
        "hospitalized":2
    }
}

在这种情况下,我收到了no (or more than one) schemas match 错误,但我希望它是有效的,因为由于患者没有住院,hospitalized 的值必须为 2。

我的第二个 JSON 文件是

{ 
    "classification":3,
    "evolution":2,
    "hospitalization": {
        "hospitalized":1,
        "hospital":"Hospital Name"
    }
}

此 JSON 文件已正确验证,但如果我将 hospitalized 的值更改为 2,该文件仍然有效,但这不是真的,因为由于患者没有住院 ("hospitalized": 2),因此我的 JSON 文件不应包含hospital 字段。

如何解决这些错误?即保证hospitalized字段为1时,hospital字段是必须的,hospitalized字段为2时,hospital字段是不必要的。

【问题讨论】:

    标签: json validation jsonschema


    【解决方案1】:

    您的第一个测试用例不起作用的原因仅仅是因为#/definitions/hopitalized_schema 的拼写错误。它说hospitalized_schema: 而不是hospitalized_schema。当您删除多余的: 时,它会按预期工作。

    至于您的第二个测试用例,我建议您不要考虑让hospital 字段出现错误。使用 JSON 和 JSON Schema 时的最佳做法是忽略您不感兴趣的任何其他属性。在这种情况下,hospital 不相关,因此应该被忽略。

    但是,如果当hospitalized2hospital 属性不存在确实很重要,您可以将"not": { "required": ["hospital"] } 添加到#/definitions/not_hospitalized_schema 以明确要求它不存在。

    【讨论】:

    • 谢谢!使用 "not": { "required": ["hospital"] } (并删除额外的 ':' )完全解决了我的问题。
    猜你喜欢
    • 2016-10-17
    • 2020-06-09
    • 1970-01-01
    • 2017-06-24
    • 2022-11-18
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    相关资源
    最近更新 更多