Swagger 2.0 中没有类型属性的架构对象

Mar*_*kša 5 jsonschema swagger swagger-2.0 openapi

Swagger/OpenAPI 2.0 中的 Schema 对象是否必须具有该type属性?

一方面,根据 JSON Schema Draft 4 规范,不指定type属性是可以的,这意味着实例可以是任何类型(对象、数组或基元)。

另一方面,我已经看到很多 Swagger 模式,其中包含没有type属性的Schema 对象,但是有properties属性,这清楚地表明模式作者希望实例是一个适当的对象(并且不想接受数组或原始值作为有效值)。

所有这些模式都不正确吗?或者是type: object隐含的存在properties?Swagger 或 JSON Schema 规范中都没有说明情况就是如此。事实上,我看到一些评论明确表示情况并非如此。

Hel*_*len 7

就像在 JSON Schema 中一样,OpenAPI 模式对象不需要type,你是对的,因为 notype意味着任何类型

“类型专用”的关键字,例如propertiesitemsminLength不强制执行一种类型的架构。反之亦然——当根据模式验证实例时,这些关键字仅在实例具有相应类型时才适用,否则它们将被忽略。这是JSON 模式验证规范的相关部分:

4.1. 关键字和实例基元类型

某些验证关键字仅适用于一种或多种原始类型。当实例的原始类型不能被给定的关键字验证时,对该关键字和实例的验证应该成功。

例如,考虑这个模式:

definitions:
  Something:
    properties:
      id:
        type: integer
    required: [id]
    minLength: 8
Run Code Online (Sandbox Code Playgroud)

这是一个有效的模式,即使它结合了特定于对象的关键字propertiesrequired特定于字符串的关键字minLength。这个架构意味着:

  • 如果实例是一个对象,它必须有一个名为 的整数属性id。例如,{"id": 4}{"id": -1, "foo": "bar"}是有效的,但{}{"id": "ACB123"}不是。

  • 如果实例是字符串,则它必须至少包含 8 个字符。"Hello, world!"是有效的,但""abc没有。

  • 任何其它类型的实例是有效的- ,truefalse-1.234[][1, 2, 3][1, "foo", true]等。OpenAPI的3.0,非类型化的模式还允许null

如果有工具type从其他关键字中推断出(例如,使用 notype但使用propertiesas always 对象处理模式),那么这些工具并不完全遵循 OpenAPI 规范和 JSON 模式。


底线:如果架构必须始终是对象,请type: object显式添加。否则你可能会得到意想不到的结果。