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 。
“类型特定”关键字,例如 properties
、items
、minLength
等。不强制使用类型模式。它以另一种方式工作——当根据模式验证实例时,这些关键字仅在实例具有相应类型时适用,否则它们将被忽略。这是 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
这是一个有效的模式,即使它结合了特定于对象的关键字 properties
和 required
以及特定于字符串的关键字 minLength
。此架构表示:
如果实例是一个对象,它必须有一个名为 id
的整数 属性。例如,{"id": 4}
和 {"id": -1, "foo": "bar"}
有效,但 {}
和 {"id": "ACB123"}
无效。
如果实例是字符串,它必须至少包含 8 个字符。 "Hello, world!"
有效,但 ""
和 abc
无效。
任何其他类型的实例都是有效的 - true
、false
、-1.234
、[]
、[1, 2, 3]
、[1, "foo", true]
,等等。在 OpenAPI 3.0 中,无类型模式也 allow null
values。
如果有工具可以从其他关键字推断出 type
(例如,处理没有 type
但始终带有 properties
对象的模式),则这些工具不是完全遵循 OpenAPI 规范和 JSON 模式。
底线:如果模式必须始终是对象,请明确添加“type: object”。否则你可能会得到意想不到的结果。
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
“类型特定”关键字,例如 properties
、items
、minLength
等。不强制使用类型模式。它以另一种方式工作——当根据模式验证实例时,这些关键字仅在实例具有相应类型时适用,否则它们将被忽略。这是 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
这是一个有效的模式,即使它结合了特定于对象的关键字 properties
和 required
以及特定于字符串的关键字 minLength
。此架构表示:
如果实例是一个对象,它必须有一个名为
id
的整数 属性。例如,{"id": 4}
和{"id": -1, "foo": "bar"}
有效,但{}
和{"id": "ACB123"}
无效。如果实例是字符串,它必须至少包含 8 个字符。
"Hello, world!"
有效,但""
和abc
无效。任何其他类型的实例都是有效的 -
true
、false
、-1.234
、[]
、[1, 2, 3]
、[1, "foo", true]
,等等。在 OpenAPI 3.0 中,无类型模式也 allownull
values。
如果有工具可以从其他关键字推断出 type
(例如,处理没有 type
但始终带有 properties
对象的模式),则这些工具不是完全遵循 OpenAPI 规范和 JSON 模式。
底线:如果模式必须始终是对象,请明确添加“type: object”。否则你可能会得到意想不到的结果。