最近在项目中遇到了schema校验问题,json数据中字段的输入情况是动态的,即一个接口需要满足两种数据格式,而这两份数据只有个别字段不一致,但是只能用一个schema文件进行校验,问题来了,如何用一个schema文件校验两个数据呢?
将json数据转为schema格式,在下面的链接中可以实现:
https://www.jsonschema.net
下面的数据中,outHospitalNum与inHospitalNum为互斥关系,即只能存在一个,于是我采用了oneOf的方法进行了定义。定义key而不是value的类型需要用到关键字required。
schema示例:
{
"definitions": {},
"type": "object",
"required": [],
"properties": {
"count": {
"oneOf": [{
"required": "number"
},
{
"minimum": 20
}]
}
}
}
有且仅有一种情况满足时才能通过
而一般情况下,要用一个schema校验两个数据,必定伴生着某些必须字段,如果都用oneOf反而会很麻烦,于是dependencies登场了。
{
"definitions": {
"diseaseList": {
"type": "string"
},
"inHospitalNum": {
"type": "string"
},
"outHospitalNum": {
"type": "string"
}
},
"dependencies": {
"inHospitalNum": [
"A",
"B",
"C"
],
"outHospitalNum": [
"D",
"E",
"F"
],
"A": [
"inHospitalNum"
],
"B": [
"inHospitalNum"
],
"C": [
"inHospitalNum"
],
"D": [
"outHospitalNum"
],
"E": [
"outHospitalNum"
],
"F": [
"outHospitalNum"
]
},
"required": [
"code"
],
"properties": {
"code": {
"type": "string"
},
"inHospitalNum": {
"$ref": "#/definitions/inHospitalNum"
},
"outHospitalNum": {
"$ref": "#/definitions/outHospitalNum"
},
"A": {
"type": "string"
},
"B": {
"type": "string"
},
"C": {
"type": "number"
},
"D": {
"type": "string"
},
"E": {
"type": "string"
},
"F": {
"type": "number"
}
},
"oneOf": [
{
"required": [
"outHospitalNum"
]
},
{
"required": [
"inHospitalNum"
]
}
]
}
这种嵌套模式的schema可以进行校验,在线校验链接如下:
https://json-schema-validator.herokuapp.com/
json数据和schema通过后,显示successfully
如代码中所示,dependencies将与之相关的字段相联系,假如A存在,B,C,D中任意一个不存在,则无法通过,这种硬连接满足了我们对数据校验的要求。