什么等效于OpenAPI 3.1中的多个类型?有没有



我想将多个类型(在JSON Schema的最新草案中支持,OpenAPI v3.1也支持(更改为anyOfoneOf,但我有点困惑这些类型将映射到哪一个。或者我可以映射到这两个类型中的任何一个。

PS。我确实知道anyOfoneOf等,但多种类型的行为有点模糊。(我知道模式是无效的,但它只是一个更侧重于类型转换的例子(

{
"type": ["null", "object", "integer", "string"],
"properties": {
"prop1": {
"type": "string"
},
"prop2": {
"type": "string"
}
},
"enum": [2, 3, 4, 5],
"const": "sample const entry",
"exclusiveMinimum": 1.22,
"exclusiveMaximum": 50,
"maxLength": 10,
"minLength": 2,
"format": "int32"
}

我用这种方式转换它。

{
"anyOf": [{
"type": "null"
},
{
"type": "object",
"properties": {
"prop1": {
"type": "string"
},
"prop2": {
"type": "string"
}
}
},
{
"type": "integer",
"enum": [2, 3, 4, 5],
"exclusiveMinimum": 1.22,
"exclusiveMaximum": 50,
"format": "int32"
},
{
"type": "string",
"maxLength": 10,
"minLength": 2,
"const": "sample const entry"
}
]
}

anyOfoneOf在语义上更匹配;

oneOf的问题(或好处!(是,如果您碰巧匹配两种不同的情况,它将失败。

考虑到转换的来源具有那些松散的语义,这不太可能是您想要的。

例如,想象一下转换["integer","number"];如果输入是一个1,那么您将两者匹配,并使用oneOf失败。

首先,您的示例无效:

  1. 初始模式与任何内容都不匹配,它是一个";不可能";架构。"enum": [2, 3, 4, 5]"const": "sample const entry"约束是互斥的,"const": "sample const entry""maxLength": 10也是互斥的。

  2. 重写的模式与原始模式不等价,因为enumconst是从根级别移动到子模式中的。是的,这样模式更有意义,也会起作用(例如,它会匹配指定的数字,但不会匹配字符串!因为constmaxLength的矛盾(,但它与原始模式不同。


关于oneOf/anyOf:

这取决于情况

anyOfoneOf之间的选择取决于上下文,即实例是否可以匹配多个子模式,或者

恰好匹配一个例如,

"type": ["number", "integer"]

对应于CCD_ 25,因为存在重叠-整数值也是有效的";数字";JSON架构中的值。

"type": ["string", "integer"]

可以使用CCD_ 26或CCD_。CCD_ 28在语义上更接近,因为字符串和整数是完全不同的数据类型,没有重叠。但从技术上讲,anyOf也有效,只是在这种特殊情况下不会有超过一个子模式匹配。


在您的示例中,所有基本type值都是不同的,没有重叠,所以我会使用oneOf,但从技术上讲,anyOf也可以。

相关内容

  • 没有找到相关文章

最新更新