oneOf,dependencies語法解決shcema校驗中的多數據問題

文章大綱


簡介

最近在項目中遇到了schema校驗問題,json數據中字段的輸入情況是動態的,即一個接口需要滿足兩種數據格式,而這兩份數據只有個別字段不一致,但是隻能用一個schema文件進行校驗,問題來了,如何用一個schema文件校驗兩個數據呢
將json數據轉爲schema格式,在下面的鏈接中可以實現:

詳見第三方包: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中任意一個不存在,則無法通過,這種硬連接滿足了我們對數據校驗的要求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章