OpenAPI / JSON Schema 中的多重继承/组合

Jér*_*ôme 3 multiple-inheritance jsonschema swagger openapi

在 OpenAPI 中,继承是通过allof. 例如,在这个例子中:

\n\n
  "definitions": {\n    "Pet": {\n      "type": "object",\n      "allOf": [\n        {\n          "$ref": "#/definitions/NewPet"   #\xc2\xa0<--- here\n        },\n        [...]\n      ]\n    },\n    "NewPet": {\n      "type": "object",\n      "properties": {\n        "name": {\n          "type": "string"\n        },\n      }\n    },\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在规范中没有找到有关多重继承的任何内容。例如,如果 Pet 继承自 NewPet 和 OldPet。

\n\n

在Python中,我会写

\n\n
class Pet(NewPet, OldPet):\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且方法解析顺序确定了应该首先检查哪个父类的方法/属性,因此我可以判断 Pet.age 是 NewPet.age 还是 OldPet.age。

\n\n

那么,如果我让 Pet 继承 NewPet 和 OldPet,其中 name 属性在两个模式中都定义,并且每个模式具有不同的值,会怎样呢?宠物名称是什么?

\n\n
  "definitions": {\n    "Pet": {\n      "type": "object",\n      "allOf": [\n        {\n          "$ref": "#/definitions/NewPet"   # <--- multiple inheritance\n          "$ref": "#/definitions/OldPet"\n        },\n        [...]\n      ]\n    },\n    "NewPet": {\n      "type": "object",\n      "properties": {\n        "name": {\n          "type": "string"\n        },\n      }\n    },\n    "OldPet": {\n      "type": "object",\n      "properties": {\n        "name": {\n          "type": "integer"    # <-- name redefined here, different type\n        },\n      }\n    },\n
Run Code Online (Sandbox Code Playgroud)\n\n

OldPet 会优先吗?新宠物?它未定义/无效?是应用程序定义的吗?

\n\n

我在swagger-editor中尝试过这个。显然,具有两个引用的模式是有效的,但 swagger-editor 无法解析属性。如果只是显示所有的两个引用。

\n\n

编辑:根据本教程,在同一个 allof 中拥有多个引用是有效的。但没有提及两个模式具有相同名称的不同属性的情况。

\n

Jas*_*ers 5

JSON Schema 不支持继承。的行为allOf有时看起来像继承,但如果您这样思考,您最终会感到困惑。

allOf关键字的含义正如其所言:所有模式都必须经过验证。没有什么可以被覆盖或优先于其他任何事物。一切都必须验证。

在您的示例中,JSON 值必须针对“NewPet”和“OldPet”进行完整验证。由于没有可以同时验证为字符串和整数的 JSON 值,因此“name”属性的验证始终无法针对“NewPet”或“OldPet”(或两者)进行验证。因此,“Pet”模式永远不会根据任何给定的 JSON 值进行验证。