JSON 模式验证
JSON Schema oneOf validation
我正在尝试创建一个 JSON 架构,它允许 属性 是数字或特定格式的对象。
我的数据是这样的:
{
"num": 200
}
我的架构如下所示:
{
"properties": {
"num": {
"type": [
"number",
"object"
],
"oneOf": [
{
"type": "number"
},
{
"$ref": "#/definitions/Variable"
}
]
}
},
"required": [
"num"
],
"additionalProperties": false,
"definitions": {
"Variable": {
"title": "Variable",
"properties": {
"$variable$": {
"type": "boolean",
"example": true
},
"name": {
"type": "string"
},
"defaultValue": {
"type": [
"string",
"object",
"number"
]
}
},
"required": [
"$variable$",
"name"
],
"additionalProperties": false
}
}
}
当我 运行 通过这里的验证器时:https://www.jsonschemavalidator.net/
我收到这个错误:
Message: JSON is valid against more than one schema from 'oneOf'. Valid schema indexes: 0, 1.
Schema path: #/properties/num/oneOf
我假设我遗漏了一些关于 oneOf
工作原理的明显信息,但我不知道它可能对我有什么影响。非常感谢这里的任何帮助,谢谢!
对于你的情况,你根本不需要 oneOf,你可以简单地使用
"type": ["number",{"$ref":"#/definitions/Variable"}] 而不是 "type": ["number","object"]
{
"properties": {
"num": {
"type": [
"number",{"$ref":"#/definitions/Variable"}
]
}
},
"required": [
"num"
],
"additionalProperties": false,
"definitions": {
"Variable": {
"title": "Variable",
"properties": {
"$variable$": {
"type": "boolean",
"example": true
},
"name": {
"type": "string"
},
"defaultValue": {
"type": [
"string",
"object",
"number"
]
}
},
"required": [
"$variable$",
"name"
],
"additionalProperties": false
}
}
}
您得到的错误是告诉您你们两个 oneOf
模式都被验证为真。值 4
对以下架构有效可能令人惊讶。
{
"properties": {
"foo": { "type": "string": }
},
"required": ["foo"]
}
事实证明,当值不是对象时,properties
关键字和 required
关键字不适用。因此,在针对数字(或任何非对象)进行验证时,上述模式实际上是空模式 ({}
)。因为空模式意味着没有约束,所以一切都是有效的。
要解决您的问题,只需将 "type": "object"
添加到您的 /definitions/Variable
架构。
我正在尝试创建一个 JSON 架构,它允许 属性 是数字或特定格式的对象。
我的数据是这样的:
{
"num": 200
}
我的架构如下所示:
{
"properties": {
"num": {
"type": [
"number",
"object"
],
"oneOf": [
{
"type": "number"
},
{
"$ref": "#/definitions/Variable"
}
]
}
},
"required": [
"num"
],
"additionalProperties": false,
"definitions": {
"Variable": {
"title": "Variable",
"properties": {
"$variable$": {
"type": "boolean",
"example": true
},
"name": {
"type": "string"
},
"defaultValue": {
"type": [
"string",
"object",
"number"
]
}
},
"required": [
"$variable$",
"name"
],
"additionalProperties": false
}
}
}
当我 运行 通过这里的验证器时:https://www.jsonschemavalidator.net/
我收到这个错误:
Message: JSON is valid against more than one schema from 'oneOf'. Valid schema indexes: 0, 1.
Schema path: #/properties/num/oneOf
我假设我遗漏了一些关于 oneOf
工作原理的明显信息,但我不知道它可能对我有什么影响。非常感谢这里的任何帮助,谢谢!
对于你的情况,你根本不需要 oneOf,你可以简单地使用 "type": ["number",{"$ref":"#/definitions/Variable"}] 而不是 "type": ["number","object"]
{
"properties": {
"num": {
"type": [
"number",{"$ref":"#/definitions/Variable"}
]
}
},
"required": [
"num"
],
"additionalProperties": false,
"definitions": {
"Variable": {
"title": "Variable",
"properties": {
"$variable$": {
"type": "boolean",
"example": true
},
"name": {
"type": "string"
},
"defaultValue": {
"type": [
"string",
"object",
"number"
]
}
},
"required": [
"$variable$",
"name"
],
"additionalProperties": false
}
}
}
您得到的错误是告诉您你们两个 oneOf
模式都被验证为真。值 4
对以下架构有效可能令人惊讶。
{
"properties": {
"foo": { "type": "string": }
},
"required": ["foo"]
}
事实证明,当值不是对象时,properties
关键字和 required
关键字不适用。因此,在针对数字(或任何非对象)进行验证时,上述模式实际上是空模式 ({}
)。因为空模式意味着没有约束,所以一切都是有效的。
要解决您的问题,只需将 "type": "object"
添加到您的 /definitions/Variable
架构。