【问题标题】:Schema object without a type attribute in Swagger 2.0Swagger 2.0 中没有类型属性的模式对象
【发布时间】:2017-11-19 08:29:42
【问题描述】:

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

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

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

所有这些模式都不正确吗?还是properties 的存在暗示了type: object? Swagger 或 JSON Schema 规范中都没有说明是这种情况。事实上,我见过 cmets 明确表示情况并非如此。

【问题讨论】:

    标签: swagger jsonschema swagger-2.0 openapi


    【解决方案1】:

    就像在 JSON Schema 中一样,OpenAPI 模式对象 do not require a type,你是正确的,没有 type 意味着 any type

    “特定于类型”的关键字,例如 propertiesitemsminLength 等。不对架构强制类型。它的工作方式相反——当一个实例根据一个模式进行验证时,这些关键字只在实例属于相应类型时应用,否则它们被忽略。这是JSON Schema Validation 规范的相关部分:

    4.1.关键字和实例原语类型

    某些验证关键字仅适用于一种或多种原始类型。当实例的原始类型无法通过给定关键字验证时,此关键字和实例的验证应该成功。

    例如,考虑这个架构:

    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 Schema .


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

    【讨论】:

    • 感谢您的详细解释。这也是我理解 JSON Schema 规范的方式。但是,即使是 Swagger 代码生成器(在 Swagger 编辑器中可用)也不能正确处理这个问题。例如,如果您打开 petstore swagger 架构,从 Tag 对象架构中删除 type: object,然后生成客户端(我尝试了 Go 和 Java),代码不允许标签是对象(例如Pet 类包含一个名为tags 的数组,它只能包含Tag 对象,不能包含原语或数组。
    • @MarkoLukša:这是 Codegen 的问题。随时提交错误Codegen repository
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2021-04-11
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多