2017-02-24 765 views
1

在OpenAPI中,使用allof可以實現繼承。例如,在this exampleOpenAPI/JSON Schema中的多繼承/組合

"definitions": { 
    "Pet": { 
     "type": "object", 
     "allOf": [ 
     { 
      "$ref": "#/definitions/NewPet" # <--- here 
     }, 
     [...] 
     ] 
    }, 
    "NewPet": { 
     "type": "object", 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     } 
    }, 

我沒有關於多重繼承規範什麼發現。例如,如果Pet從NewPet和OldPet繼承。

在Python中,我會寫

class Pet(NewPet, OldPet): 
    ... 

和方法解析順序是確定哪些父類,應首先檢查方法/屬性,所以我可以告訴如果Pet.age會NewPet.age或OldPet.age。

那麼,如果我讓Pet繼承NewPet和OldPet,其中name屬性是在兩個模式中定義的,每個模式都有不同的值呢?什麼是Pet.name?

"definitions": { 
    "Pet": { 
     "type": "object", 
     "allOf": [ 
     { 
      "$ref": "#/definitions/NewPet" # <--- multiple inheritance 
      "$ref": "#/definitions/OldPet" 
     }, 
     [...] 
     ] 
    }, 
    "NewPet": { 
     "type": "object", 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     } 
    }, 
    "OldPet": { 
     "type": "object", 
     "properties": { 
     "name": { 
      "type": "integer" # <-- name redefined here, different type 
     }, 
     } 
    }, 

OldPet會優先嗎? NewPet?它是未定義的/無效的?它是應用程序定義的?

我在swagger-editor試過這個。很顯然,具有兩個引用的架構是有效的,但是,swagger-editor不能解析這些屬性。如果只是顯示所有的兩個引用。

編輯:根據this tutorial,有幾個參考文獻在同一個allof是有效的。但是對於兩個模式具有不同屬性且具有相同名稱的情況沒有任何說法。

回答

2

JSON Schema不支持繼承。 allOf的行爲有時看起來像繼承,但如果你這樣想,你最終會變得困惑。

allOf關鍵字的含義如下:所有模式必須驗證。沒有什麼會被覆蓋或優先於其他任何東西。一切都必須驗證。

在您的示例中,JSON值必須完全針對「NewPet」和「OldPet」進行驗證。由於沒有可以驗證字符串和整數的JSON值,「name」屬性的驗證將始終無法根據「NewPet」或「OldPet」(或兩者)進行驗證。因此,「寵物」模式將永遠不會針對任何給定的JSON值進行驗證。

+0

謝謝。這個答案很清楚。我想這樣做的結果是OpenAPI不應該只依靠一個'allOf'來管理繼承,因爲存在一些特殊情況,就像我公開的那樣,其中Schemas彼此繼承,但是'allOf'不能用過的。在這種情況下,像'x-inherits'或'x-childOf'這樣的顯式字段會派上用場。 –