如何在 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
不相关,因此应该忽略。
但是,如果当 hospitalized
为 2
时 hospital
属性 不存在真的很重要,您可以将 "not": { "required": ["hospital"] }
添加到 #/definitions/not_hospitalized_schema
明确要求它不存在。
我有一个定义疾病通知数据的 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
不相关,因此应该忽略。
但是,如果当 hospitalized
为 2
时 hospital
属性 不存在真的很重要,您可以将 "not": { "required": ["hospital"] }
添加到 #/definitions/not_hospitalized_schema
明确要求它不存在。