我是json架构的新手 . 我尝试了一些复杂的混合,它不像我预期的那样工作 . 我有以下json:
{
"aaa": {
"Type": "Type1",
"prop1": "val3"
},
"bbb": {
"Type": "Type1",
"prop2": "val4"
}
}
想法是json包含具有Type1的对象的jsons,其具有变量key(属性?)名称, may 包含另一个对象(Type2或Type3),并且唯一的强制属性是Type为Type1的Type
我尝试使用以下架构来验证上面的json:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"definitions": {
"Type1": {
"type": "object",
"properties": {
"Type": {
"const": "Type1"
},
"prop1": {
"type": "string"
},
"prop2": {
"type": "string"
}
},
"patternProperties": {
"^[a-zA-Z0-9_]+$": {
"oneOf": [
{
"$ref": "#/definitions/Type2"
},
{
"$ref": "#/definitions/Type3"
}
]
}
},
"required": [
"Type"
],
"additionalProperties": false
},
"Type2": {
"type": "object",
"properties": {
"PropArr": {
"type": "array",
"items": {
"type": "string"
}
},
"Type": {
"const": "Type2"
}
},
"required": [
"PropArr",
"Type"
],
"additionalProperties": false
},
"Type3": {
"type": "object",
"properties": {
"Prop": {
"type": "array",
"items": {
"type": "string"
}
},
"Type": {
"const": "Type3"
}
},
"required": [
"Prop",
"Type"
],
"additionalProperties": false
}
},
"patternProperties": {
"^[a-zA-Z0-9_]+$": {
"type": "object",
"oneOf": [
{
"$ref": "#/definitions/Type1"
}
]
}
},
"minProperties": 1,
"additionalProperties": false
}
但是我无法验证这个json,因为它不包含type1对象的type2或type3 . 为模式属性指定“oneof”(在Type1中)意味着它必须包含图案属性?有没有办法在架构中使该对象可选?
1 回答
这里几乎没有问题和误解 . 没关系 .
我将您的架构和JSON实例放入online validator . 我发现这对于获得验证失败原因的即时反馈非常有帮助 .
您想采取的方法是正确的,但实施稍有偏差 .
在所有定义之后从
patternProperties
开始,您已经声明每个属性(与模式匹配)必须具有作为对象的值 . 好 . 对象必须是Type1
,您已正确引用 .在
Type1
的定义中,您使用了properties
和patternProperties
.patternProperties
正在应用于您已在properties
中指定的属性,因为它不会排除在其他基于"properties"的关键字中找到的属性 . 但是,additionalProperties
(可能是模式)仅适用于properties
和patternProperties
尚未涵盖的那些属性 .Draft-7 validations additionalProperties
希望这个解释和在线验证器的链接(提供有用的验证失败消息)将允许您使用您的架构 . 当我看不到更多可能的实例json数据时,给你一个更正的架构有点困难 .