它看起来像我的输入验证代码一样正常。那么确切的区别是什么?
带有oneof的架构
[{
"id": "MyAction",
"oneOf": [{ "$ref": "A1" },
{ "$ref": "A2" }]
},
{
"id": "A1",
"properties": {
"class1": { "type": "string"},
"class2": { "type": "string"}
}
},
{
"id": "A2",
"properties": {
"class2": { "type": "string"},
"class3": { "type": "string"}
}
}
]
架构与任何
[{
"id": "MyAction",
"anyOf": [{ "$ref": "A1" },
{ "$ref": "A2" }]
},
{
"id": "A1",
"properties": {
"class1": { "type": "string"},
"class2": { "type": "string"}
}
},
{
"id": "A2",
"properties": {
"class2": { "type": "string"},
"class3": { "type": "string"}
}
}
]
答案 0 :(得分:13)
如果你看JSON Schema documentation,就说:
5.5.4。 anyOf
5.5.4.1。有效值
此关键字的值必须是一个数组。这个数组必须至少有一个元素。
数组的元素必须是对象。每个对象必须是有效的JSON模式。
5.5.4.2。成功验证的条件
如果该关键字针对此关键字的值定义的至少一个架构成功验证,则该实例会成功验证此关键字。
5.5.5。 oneOf
5.5.5.1。有效值
此关键字的值必须是一个数组。这个数组必须至少有一个元素。
数组的元素必须是对象。每个对象必须是有效的JSON模式。
5.5.5.2。成功验证的条件
如果某个实例针对此关键字的值定义的完全一个架构成功验证,则该实例会成功验证此关键字。
请注意我在上面的重点。 anyOf
表示该项必须针对至少一个(但可能是多个)模式进行验证。 oneOf
表示它必须仅针对模式中的一个进行验证。
答案 1 :(得分:0)
我的任务很晚,但据我了解,此关键字的用法取决于对象/父对象本身的类型。例如,如果您尝试为对象或数组元素的单个属性定义类型。以以下示例为例:
{
"title": "Sample JSON Schema",
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"definitions": {
"propObjectType1" : {
"name": "string",
"age": "number"
},
"propObjectType2" : {
"name": "string",
"dob": {
"type": "string",
"pattern": "\\d\\d\/\\d\\d\/\\d\\d\\d\\d"
}
}
},
"properties": {
"prop1": {
"type": "string",
"maxLength": 64
},
"prop2": {
"anyOf": [
{
"$ref": "#/definitions/propObjectType1"
},
{
"$ref": "#/definitions/propObjectType2"
}
]
},
"prop3": {
"oneOf": [
{
"$ref": "#/definitions/propObjectType1"
},
{
"$ref": "#/definitions/propObjectType2"
}
]
},
"prop4Array": {
"type": "array",
"items": {
"oneOf": [
{
"$ref": "#/definitions/propObjectType1"
},
{
"$ref": "#/definitions/propObjectType2"
}
]
}
},
"prop5Array": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/propObjectType1"
},
{
"$ref": "#/definitions/propObjectType2"
}
]
}
}
}
}
因此,在上面的定义中,prop2和prop3是相同的(可以互换使用anyOf
或oneOf
),并且可以定义自己喜欢的对象。但是,如果是数组:
anyOf
用于项目类型时,元素可以是那些元素之外的任何类型,并且数组可以包含混合项目。意味着您可以拥有一个类型为1的项目,而可以拥有另一个类型为2的项目。oneOf
用于项目类型时,元素可以是那些元素之外的任何类型,并且数组只能包含一种类型的项目。表示所有项目都必须是同一类型(类型1或类型2)。