Swagger 2.0 中没有类型属性的模式对象

Schema object without a type attribute in Swagger 2.0

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

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

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

所有这些模式都不正确吗?还是 properties 的存在暗示了 type: object? Swagger 或 JSON Schema 规范中没有任何内容表明情况如此。事实上,我看到评论明确表示并非如此。

如 JSON 模式,OpenAPI 模式对象 do not require a type, and you are correct in that no type means

“类型特定”关键字,例如 propertiesitemsminLength 等。不强制使用类型模式。它以另一种方式工作——当根据模式验证实例时,这些关键字仅在实例具有相应类型时适用,否则它们将被忽略。这是 JSON Schema Validation 规范的相关部分:

4.1. Keywords and instance primitive types

Some validation keywords only apply to one or more primitive types. When the primitive type of the instance cannot be validated by a given keyword, validation for this keyword and instance SHOULD succeed.

例如,考虑这个架构:

definitions:
  Something:
    properties:
      id:
        type: integer
    required: [id]
    minLength: 8

这是一个有效的模式,即使它结合了特定于对象的关键字 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 中,无类型模式也 allow null values

如果有工具可以从其他关键字推断出 type(例如,处理没有 type 但始终带有 properties 对象的模式),则这些工具不是完全遵循 OpenAPI 规范和 JSON 模式。


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