24

如何将属性指定为 null 或引用?讨论如何使用 jsonschema 将属性指定为 null 或引用。

我希望用招摇来做同样的事情。

回顾上面的答案,使用 jsonschema,可以这样做:

{
   "definitions": {
      "Foo": {
         # some complex object
      }
   },

   "type": "object",
   "properties": {
      "foo": {
         "oneOf": [
            {"$ref": "#/definitions/Foo"},
            {"type": "null"}
         ]
      }
   }
}

答案的关键在于使用oneOf.

我的问题的关键点:

  1. 我有一个复杂的对象,我想保持 DRY,所以我把它放在定义部分,以便在我的招摇规范中重用:其他属性的值;响应对象等

  2. 在我的规范中的各个地方,属性可能是对此类对象的引用或为空。

如何使用不支持oneOfor 的 Swagger 指定它anyOf

注意:一些 swagger 实现使用x-nullable(或类似的)来指定属性值可以为 null,但是,将对象$ref 替换为它引用的对象,因此看起来任何使用 ofx-nullable都会被忽略。

4

3 回答 3

42
于 2018-01-05T13:47:51.013 回答
3

做到这一点并不容易。甚至几乎不可能。您的选择:

等待

关于这一点有一个很长的讨论,也许有一天会完成......

使用供应商扩展

您可以使用供应商扩展,例如x-oneOfx-anyOf。我已经采取了这种艰难的方式:您必须升级所有使用的“招摇工具”以考虑这些供应商的扩展。

就我而言,我们只需要:

  • 使用自定义注释开发我们自己的 Jax-RS 解析器,以便从源代码中提取 swagger API 文件
  • 扩展 swagger-codegen 以考虑这些扩展,为我们的客户生成 java 代码
  • 开发我们自己的 swagger-ui:为了促进这项工作,我们添加了一个预处理步骤,将带有扩展的 swagger 模式转换为有效的 json 模式。找到一个模块来表示 json 模式比 javascript 中的 swagger 模式更容易。由于缺点,我们放弃了使用“试用”按钮测试 API 的想法。

一年前,也许现在...

重构您的 API

许多项目不需要 anyOf 和 oneOf,为什么我们不需要呢?

于 2016-12-07T08:00:30.717 回答
1

对于OpenAPI 3.0出于某种原因使用nullable: true后跟allOf不适用于我正在使用的 OpenAPI 解释器。作为一种解决方法,我最终定义了一个必须为空的引用null_type,我可以在anyOf构造中使用它。

像这样:

allOf:
  - anyOf:
      - $ref: "#/components/schemas/null_type"
      - $ref: "#/components/schemas/your_ref"
  - description: "optionally add other properties here..."

在哪里:

schemas:
  null_type:
    title: "OpenAPI 3.0 null-type ref"
    description: "for adding nullability to a ref"
    enum: [null]

  your_ref:
    ...
于 2022-01-10T20:07:29.593 回答