我正在爲收據創建模式,並希望爲核心概念提供一個主模式,併爲專門的收據類型提供各種不同的明細對象(例如,分項酒店收據等)我當前實現借力oneOf
機制,JSON-模式在JSON模式中的不同對象之間進行選擇
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Receipt",
"type": "object",
"properties": {
...
"amount": { "type": "number" },
"detail": {
"type": "object",
"oneOf": [
{ "$ref": "general-detail.schema.json" },
{ "$ref": "hotel-detail.schema.json" },
...
]
}
}
}
這種方法的問題是,當我驗證(使用TV4),似乎都在oneOf
指定的模式都被檢查,並實際上,返回錯誤。通過刪除detail
屬性,將oneOf
移動到架構級別(例如properties
之外),然後在每個子架構中創建根屬性名稱,我可以最大限度地減少這種影響。但是,即使在這種情況下,如果我驗證酒店收據類型時發生錯誤,我會收到「丟失所需屬性:generalDetail」。
所以2個問題:
- 是它甚至有可能用一個通用的
detail
財產像我目前做的,而不是有驗證完全驗證的oneOf
結構中的每個子模式(例如,我使用的oneOf
錯誤)? - 如果這是不可能的,我會比單純有一組'typed'細節屬性(如'generalDetail','hotelDetail'等)更好 - 但是有沒有辦法指定它們是並且只有其中一個應該存在於正在驗證的文檔中?
TIA