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 规范中都没有说明情况就是如此。事实上,我看到一些评论明确表示情况并非如此。
就像在 JSON Schema 中一样,OpenAPI 模式对象不需要type,你是对的,因为 notype意味着任何类型。
“类型专用”的关键字,例如properties,items,minLength等不强制执行一种类型的架构。反之亦然——当根据模式验证实例时,这些关键字仅在实例具有相应类型时才适用,否则它们将被忽略。这是JSON 模式验证规范的相关部分:
4.1. 关键字和实例基元类型
某些验证关键字仅适用于一种或多种原始类型。当实例的原始类型不能被给定的关键字验证时,对该关键字和实例的验证应该成功。
例如,考虑这个模式:
definitions:
Something:
properties:
id:
type: integer
required: [id]
minLength: 8
Run Code Online (Sandbox Code Playgroud)
这是一个有效的模式,即使它结合了特定于对象的关键字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,非类型化的模式还允许null值。
如果有工具type从其他关键字中推断出(例如,使用 notype但使用propertiesas always 对象处理模式),那么这些工具并不完全遵循 OpenAPI 规范和 JSON 模式。
底线:如果架构必须始终是对象,请type: object显式添加。否则你可能会得到意想不到的结果。
| 归档时间: |
|
| 查看次数: |
3717 次 |
| 最近记录: |