如何指定一个属性可以是null或一个引用与swagger

rkue9o1l  于 2023-10-18  发布在  其他
关注(0)|答案(4)|浏览(170)

How to specify a property as null or a reference?讨论了如何使用jsonschema将属性指定为null或引用。
我也想对斯威格做同样的事。
为了概括上述问题的答案,使用jsonschema,可以这样做:

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

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

答案的关键点是oneOf的使用。
我的问题的关键点是:
1.我有一个复杂的对象,我想保持DRY,所以我把它放在一个定义部分,以便在我的swagger规范中重用:其他财产的价值;响应对象等。
1.在我的规范中的不同地方,一个属性可以是对这样一个对象的引用,也可以是null。
我如何在不支持oneOfanyOf的Swagger中指定这个?
注意:一些swagger实现使用x-nullable(或类似的东西)来指定一个属性值可以为null,但是,$ref * 用它引用的对象替换 *,所以看起来任何x-nullable的使用都被忽略了。

8oomwypt

8oomwypt1#

OpenAPI 3.1

将属性定义为$reftype: 'null'anyOf
YAML版本:

foo:
  anyOf:
    - type: 'null'   # Note the quotes around 'null'
    - $ref: '#/components/schemas/Foo'

JSON版本:

"foo": {
    "anyOf": [
        { "type": "null" },
        { "$ref": "#/components/schemas/Foo" }
    ]
}

为什么使用anyOf而不是oneOf?如果引用的模式本身允许空值,则oneOf将无法通过验证,而anyOf将正常工作。

OpenAPI 3.0

YAML版本:

foo:
  nullable: true
  allOf:
  - $ref: '#/components/schemas/Foo'

JSON版本:

"foo": {
    "nullable": true,
    "allOf": [
        { "$ref": "#/components/schemas/Foo" }
    ]
}

在OAS 3.0中,需要将$ref Package 到allOf中,以便将$ref与其他关键字合并组合-因为$ref会覆盖任何同级关键字。这在OpenAPI规范库中有进一步的讨论:Reference objects don't combine well with “nullable”

wz3gfoph

wz3gfoph2#

对于 OpenAPI 3.0,由于某种原因,使用nullable: true后跟allOf对我使用的OpenAPI解释器不起作用。作为一种变通方法,我最终定义了一个名为null_typemust-be-null ref,可以在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:
    ...
cqoc49vn

cqoc49vn3#

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

等待

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

使用厂商扩展

您可以使用供应商扩展,如 x-oneOfx-anyOf。我已经走上了这条艰难的道路:你必须升级所有使用的'swagger工具',以考虑这些供应商的扩展。
在我的例子中,我们只需要:

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

一年前的事了,也许现在...

重构API

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

mi7gmzs6

mi7gmzs64#

我在.net6 webAPI中使用Swashbuckle时遇到了类似的问题。我有一个属性,它是一个对象,但也可以是空的。当对象为空时,它无法将其解析。
例如,这起了作用,并使其恢复正常

{
  "Foo":"bar"
  "Details" {
    "Test":"value",
    "Test2":"value"
  }
}

但这并没有使

{
  "Foo":"bar"
  "Details": null
}

为了解决这个问题,我在我的swagger设置中添加了以下内容。

builder.Services.AddSwaggerGen(options =>
{
     options.UseAllOfToExtendReferenceSchemas();
});

产生了以下结果

"someObject": {
  "allOf": [
    {
      "$ref": "#/components/schemas/SomeObject"
    }
  ],
  "nullable": true
},

相关问题