文章大綱
簡介
最近在項目中遇到了schema校驗問題,json數據中字段的輸入情況是動態的,即一個接口需要滿足兩種數據格式,而這兩份數據只有個別字段不一致,但是隻能用一個schema文件進行校驗,問題來了,如何用一個schema文件校驗兩個數據呢?
將json數據轉爲schema格式,在下面的鏈接中可以實現:
下面的數據中,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中任意一個不存在,則無法通過,這種硬連接滿足了我們對數據校驗的要求。