2017-02-24 766 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'这样的显式字段会派上用场。 –