JSON 架构 OneOf 级联
JSON Schema OneOf Cascading
我问自己是否可以级联多个 'oneOf' 或者是否有更好的方法使我的案例有效。
我正在尝试验证以下内容:
将 ObjectA 或 ObjectB 定义为单个对象或它们的数组
案例 1:
仅使用 ObjectA 的定义
{
"X": "test"
}
案例二:
仅使用 ObjectB 的定义
{
"Y": "test"
}
案例 3:
在数组中使用 ObjectA 或 ObjectB 的定义
[
{
"X": "test"
},
{
"Y": "test"
}
]
案例 4:
在数组中两次使用 ObjectA 的定义
[
{
"X": "test"
},
{
"X": "test"
}
]
架构:
我尝试使用此模式,MonacoEditor 的 IntelliSense 运行良好,但我仍然得到 Error/Warning:"Matches multiple schemas when only one must validate."
{
"definitions": {
"objectA": {
"type": "object",
"properties": {
"X": {
type: "string"
}
}
},
"objectB": {
"type": "object",
"properties": {
"Y": {
type: "string"
}
}
}
},
"oneOf":
[
{
"oneOf":
[
{
"$ref": "#definitions/objectA"
},
{
"$ref": "#definitions/objectB"
}
]
},
{
"type": "array",
"items":
{
"oneOf":
[
{
"$ref": "#definitions/objectA"
},
{
"$ref": "#definitions/objectB"
}
]
}
}
]
}
Error/Warning:
"Matches multiple schemas when only one must validate."
问题是您的 X 属性 in objectA 和 Y 属性 en objectB 不是必需的,因此一个空对象,即 { },对两者都有效。
此外,如果您希望包含 objectA 和 objectY 的数组有效,则需要使用 anyOf 而不是 oneOf。
{
"definitions": {
"objectA": {
"type": "object",
"properties": {
"X": {
"type": "string"
}
},
"required": ["X"]
},
"objectB": {
"type": "object",
"properties": {
"Y": {
"type": "string"
}
},
"required": ["Y"]
}
},
"oneOf":
[
{"$ref": "#/definitions/objectA"},
{"$ref": "#/definitions/objectB"},
{
"type": "array",
"minItems": 1,
"items":
{
"anyOf":
[
{"$ref": "#/definitions/objectA"},
{"$ref": "#/definitions/objectB"}
]
}
}
]
}
如果您不想使用空数组进行验证,我添加了 minItems。
我问自己是否可以级联多个 'oneOf' 或者是否有更好的方法使我的案例有效。
我正在尝试验证以下内容:
将 ObjectA 或 ObjectB 定义为单个对象或它们的数组
案例 1:
仅使用 ObjectA 的定义
{
"X": "test"
}
案例二:
仅使用 ObjectB 的定义
{
"Y": "test"
}
案例 3:
在数组中使用 ObjectA 或 ObjectB 的定义
[
{
"X": "test"
},
{
"Y": "test"
}
]
案例 4:
在数组中两次使用 ObjectA 的定义
[
{
"X": "test"
},
{
"X": "test"
}
]
架构:
我尝试使用此模式,MonacoEditor 的 IntelliSense 运行良好,但我仍然得到 Error/Warning:"Matches multiple schemas when only one must validate."
{
"definitions": {
"objectA": {
"type": "object",
"properties": {
"X": {
type: "string"
}
}
},
"objectB": {
"type": "object",
"properties": {
"Y": {
type: "string"
}
}
}
},
"oneOf":
[
{
"oneOf":
[
{
"$ref": "#definitions/objectA"
},
{
"$ref": "#definitions/objectB"
}
]
},
{
"type": "array",
"items":
{
"oneOf":
[
{
"$ref": "#definitions/objectA"
},
{
"$ref": "#definitions/objectB"
}
]
}
}
]
}
Error/Warning:
"Matches multiple schemas when only one must validate."
问题是您的 X 属性 in objectA 和 Y 属性 en objectB 不是必需的,因此一个空对象,即 { },对两者都有效。
此外,如果您希望包含 objectA 和 objectY 的数组有效,则需要使用 anyOf 而不是 oneOf。
{
"definitions": {
"objectA": {
"type": "object",
"properties": {
"X": {
"type": "string"
}
},
"required": ["X"]
},
"objectB": {
"type": "object",
"properties": {
"Y": {
"type": "string"
}
},
"required": ["Y"]
}
},
"oneOf":
[
{"$ref": "#/definitions/objectA"},
{"$ref": "#/definitions/objectB"},
{
"type": "array",
"minItems": 1,
"items":
{
"anyOf":
[
{"$ref": "#/definitions/objectA"},
{"$ref": "#/definitions/objectB"}
]
}
}
]
}
如果您不想使用空数组进行验证,我添加了 minItems。