我想创建一个架构,其中我将在“ oneOf”中包含多个对象,该对象将具有anyOf格式的许多对象,其中某些键可以是必需的类型(此部分有效) 我的架构:-
{
"description": "schema v6",
"type": "object",
"oneOf": [
{
"properties": {
"Speed": {
"items": {
"anyOf": [
{
"$ref": "#/definitions/speed"
},
{
"$ref": "#/definitions/SituationType"
}
]
},
"required": [
"speed"
]
}
},
"additionalProperties": false
}
],
"definitions": {
"speed": {
"description": "Speed",
"type": "integer"
},
"SituationType": {
"type": "string",
"description": "Situation Type",
"enum": [
"Advice",
"Depend"
]
}
}
}
但是当我尝试验证此架构但我能够验证一些不正确的值时,例如
{
"Speed": {
"speed": "ABC",//required
"SituationType1": "Advisory1" //optional but key needs to be correct
}
}
我期望的正确答复是
{
"Speed": {
"speed": "1",
"SituationType": "Advise"
}
}
答案 0 :(得分:0)
首先,您需要正确设置架构类型,否则实施可能会假设您使用的是最新的JSON架构版本(当前为draft-7)。
因此,在架构根目录中,您需要以下内容:
"$schema": "http://json-schema.org/draft-06/schema#",
第二,items
仅在目标是数组的情况下适用。
当前,您的架构仅检查以下内容:
如果根对象的属性为“ Speed”,则它的键必须为 “速度”。根对象不得具有任何其他属性。
没有别的。
您对definitions
的使用以及如何引用它们可能不是您想要的。
您似乎希望Speed
包含speed
,它必须是整数,而可选的SituationType
必须是字符串,受枚举限制,并且没有其他内容。
这是我基于此的架构,它根据给定的示例数据正确地通过和失败:
{
"$schema": "http://json-schema.org/draft-06/schema#",
"type": "object",
"oneOf": [
{
"properties": {
"Speed": {
"properties":{
"speed": {
"$ref": "#/definitions/speed"
},
"SituationType": {
"$ref": "#/definitions/SituationType"
}
},
"required": [
"speed"
],
"additionalProperties": false
}
},
"additionalProperties": false
}
],
"definitions": {
"speed": {
"description": "Speed",
"type": "integer"
},
"SituationType": {
"type": "string",
"description": "Situation Type",
"enum": [
"Advice",
"Depend"
]
}
}
}
您需要定义Speed
的属性,因为否则您将无法避免其他属性,因为additionalProperties
仅受相邻的properties
键影响。我们希望在草案8中创建一个新关键字来支持这种行为,但是在您的示例(Huge Github issue in relation)中看起来并不需要它。
现在将additionalProperties
的false添加到Speed
模式中可以防止该对象中的其他键。
我怀疑给定您的问题标题,此处可能会有更多的方案在起作用,并且您已针对此问题进行了简化。如果您有一个更复杂的问题的更详细的架构,我也很乐意提供帮助。