如何在 JSON 模式中使用 oneOf 来确保不需要 JSON 文件的某些字段

How to use oneOf in JSON Schema to ensure that certain fields of a JSON file are not required

我有一个定义疾病通知数据的 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字段。

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

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

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