2015-04-23 33 views
0

我正在爲收據創建模式,並希望爲核心概念提供一個主模式,併爲專門的收據類型提供各種不同的明細對象(例如,分項酒店收據等)我當前實現借力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

回答

0

所有oneOf的模式的需要,爲了要驗證驗證,以確保只有模式的一個通過。如果沒有通過或者超過一次通過,驗證器需要告訴您每個模式的驗證結果,以便確定如何解決錯誤。

所以,只是因爲驗證器告訴你爲什麼每個模式都失敗並不意味着它期望所有這些模式都能通過。

0
  1. 它通常使用anyOf更好 - 當你需要oneOf時,它是非常罕見的。後者將一直驗證所有模式,前者很可能在第一次通過時退出。

  2. 你可以看看其他一些驗證器。電視4與標準有很多偏差,也很慢。 https://github.com/ebdrup/json-schema-benchmark

相關問題