我想将多个类型(在JSON Schema的最新草案中支持,OpenAPI v3.1也支持(更改为anyOf
和oneOf
,但我有点困惑这些类型将映射到哪一个。或者我可以映射到这两个类型中的任何一个。
PS。我确实知道anyOf
、oneOf
等,但多种类型的行为有点模糊。(我知道模式是无效的,但它只是一个更侧重于类型转换的例子(
{
"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"
}
]
}
anyOf
比oneOf
在语义上更匹配;
oneOf
的问题(或好处!(是,如果您碰巧匹配两种不同的情况,它将失败。
考虑到转换的来源具有那些松散的语义,这不太可能是您想要的。
例如,想象一下转换["integer","number"]
;如果输入是一个1
,那么您将两者匹配,并使用oneOf
失败。
首先,您的示例无效:
-
初始模式与任何内容都不匹配,它是一个";不可能";架构。
"enum": [2, 3, 4, 5]
和"const": "sample const entry"
约束是互斥的,"const": "sample const entry"
和"maxLength": 10
也是互斥的。 -
重写的模式与原始模式不等价,因为
enum
和const
是从根级别移动到子模式中的。是的,这样模式更有意义,也会起作用(例如,它会匹配指定的数字,但不会匹配字符串!因为const
和maxLength
的矛盾(,但它与原始模式不同。
关于oneOf
/anyOf
:
这取决于情况
恰好匹配一个例如, 对应于CCD_ 25,因为存在重叠-整数值也是有效的";数字";JSON架构中的值。 而 可以使用CCD_ 26或CCD_。CCD_ 28在语义上更接近,因为字符串和整数是完全不同的数据类型,没有重叠。但从技术上讲, 在您的示例中,所有基本anyOf
和oneOf
之间的选择取决于上下文,即实例是否可以匹配多个子模式,或者"type": ["number", "integer"]
"type": ["string", "integer"]
anyOf
也有效,只是在这种特殊情况下不会有超过一个子模式匹配。type
值都是不同的,没有重叠,所以我会使用oneOf
,但从技术上讲,anyOf
也可以。