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

时间:2015-08-01 16:08:08

标签: json validation jsonschema

我有一个定义疾病通知数据的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 Schema已在网站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字段不是必需的。

1 个答案:

答案 0 :(得分:0)

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

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

但是,如果hospitalhospitalized2属性不重要,那么您可以"not": { "required": ["hospital"] }#/definitions/not_hospitalized_schema明确添加RequestHandler要求它不存在。