如何指定一个属性可以为null,也可以是一个带有swagger的引用
讨论如何使用jsonschema将属性指定为null或引用 我也希望能和斯威格做同样的事情 为了重述上述问题的答案,使用jsonschema可以做到以下几点:如何指定一个属性可以为null,也可以是一个带有swagger的引用,swagger,openapi,swagger-2.0,Swagger,Openapi,Swagger 2.0,讨论如何使用jsonschema将属性指定为null或引用 我也希望能和斯威格做同样的事情 为了重述上述问题的答案,使用jsonschema可以做到以下几点: { "definitions": { "Foo": { # some complex object } }, "type": "object", "properties": { "foo": { "oneOf": [
{
"definitions": {
"Foo": {
# some complex object
}
},
"type": "object",
"properties": {
"foo": {
"oneOf": [
{"$ref": "#/definitions/Foo"},
{"type": "null"}
]
}
}
}
答案的关键点是使用了oneOf
我的问题的要点是:
anyOf
注意:一些招摇过市的实现使用
x-nullable
(或类似的)来指定属性值可以为null,但是,$ref
将对象替换为它所引用的对象,因此看起来任何x-nullable
的使用都会被忽略。不容易做到这一点。甚至几乎不可能。您的选择:
等待
关于这一点有一个很长的讨论,也许有一天它会被完成
使用供应商扩展
您可以使用x-oneOf和x-anyOf。我已经采取了这种艰难的方式:您必须升级所有使用的“招摇过市工具”,以考虑这些供应商的扩展
就我而言,我们只需要:
- 开发我们自己的带有定制注释的Jax RS解析器,以便从源代码中提取swagger API文件
- 扩展swagger codegen以考虑这些扩展,从而为我们的客户机生成java代码
- 开发我们自己的swagger ui:为了促进这项工作,我们添加了一个预处理步骤,将带有扩展的swagger模式转换为有效的json模式。与javascript中的招摇过市模式相比,更容易找到一个模块来表示json模式。反对者放弃了用“try it”按钮测试API的想法
$ref
的anyOf
和类型:“null”
YAML版本:
foo:
任何一项:
-键入:“null”#注意“null”周围的引号
-$ref:“#/components/schemas/Foo”
JSON版本:
“foo”:{
“任何人”:[
{“type”:“null”},
{“$ref”:“#/components/schemas/Foo”}
]
}
为什么要使用anyOf
而不是oneOf
<如果引用的架构本身允许空值,则其中一个验证将失败,allOf
将正常工作
OpenAPI 3.0
YAML版本:
foo:
可为空:真
所有:
-$ref:“#/components/schemas/Foo”
JSON版本:
“foo”:{
“可为空”:正确,
“allOf”:[
{“$ref”:“#/components/schemas/Foo”}
]
}
在OAS 3.0中,需要将
$ref
包装到allOf
中,以将$ref
与其他关键字组合在一起-因为$ref
会覆盖任何同级关键字。这在OpenAPI规范库中进一步讨论:“等待”-是的,显然v3将支持其中一个,但我们必须等待使用它的工具和库。“扩展”-我正在使用python(w/bravado core)中的招摇,它没有您提到的扩展…糟糕透了。“重构”-这需要简化我的api以符合规范…我需要规范以符合我的api!对于现在返回$ref或null的情况,我唯一能想到的另一件事是不返回属性,在客户端(我的例子中是javascript)的情况下,该属性会将“undefined”视为“null”。但我讨厌这个想法。我在.net core上使用swashbuckle 5x,我想将“nullable”:true
添加到“payload”:{“$ref”:“#/components/schemas/MyClass”}
,所以它是“payload”:{“nullable”:true,$ref:“#/components/schemas/MyClass”}
,有人知道这样做有一个虚张声势的选择吗?@AdamDiament谢谢海伦,我已经做到了