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。
我如何在不支持oneOf
或anyOf
的Swagger中指定这个?
注意:一些swagger实现使用x-nullable
(或类似的东西)来指定一个属性值可以为null,但是,$ref
* 用它引用的对象替换 *,所以看起来任何x-nullable
的使用都被忽略了。
4条答案
按热度按时间8oomwypt1#
OpenAPI 3.1
将属性定义为
$ref
和type: 'null'
的anyOf
。YAML版本:
JSON版本:
为什么使用
anyOf
而不是oneOf
?如果引用的模式本身允许空值,则oneOf
将无法通过验证,而anyOf
将正常工作。OpenAPI 3.0
YAML版本:
JSON版本:
在OAS 3.0中,需要将
$ref
Package 到allOf
中,以便将$ref
与其他关键字合并组合-因为$ref
会覆盖任何同级关键字。这在OpenAPI规范库中有进一步的讨论:Reference objects don't combine well with “nullable”wz3gfoph2#
对于 OpenAPI 3.0,由于某种原因,使用
nullable: true
后跟allOf
对我使用的OpenAPI解释器不起作用。作为一种变通方法,我最终定义了一个名为null_type
的 must-be-null ref,可以在anyOf
结构中使用。就像这样:
其中:
cqoc49vn3#
要做到这点并不容易。几乎不可能。您的选择:
等待
关于这个point有很长的讨论,也许有一天会完成.
使用厂商扩展
您可以使用供应商扩展,如 x-oneOf 和 x-anyOf。我已经走上了这条艰难的道路:你必须升级所有使用的'swagger工具',以考虑这些供应商的扩展。
在我的例子中,我们只需要:
一年前的事了,也许现在...
重构API
很多项目都不需要anyOf和oneOf,为什么我们不需要?
mi7gmzs64#
我在.net6 webAPI中使用Swashbuckle时遇到了类似的问题。我有一个属性,它是一个对象,但也可以是空的。当对象为空时,它无法将其解析。
例如,这起了作用,并使其恢复正常
但这并没有使
为了解决这个问题,我在我的swagger设置中添加了以下内容。
产生了以下结果