我是json模式的新手。 我尝试了一些复杂的混合,但效果不如预期。 我有以下json:
{
"aaa": {
"Type": "Type1",
"prop1": "val3"
},
"bbb": {
"Type": "Type1",
"prop2": "val4"
}
}
想法是json包含类型为1的对象的json,这些对象具有可变键(属性?)名称,并且可能包含另一个对象(类型2或类型3),并且是唯一的必需属性是Type,其值为Type1
我试图使用以下模式来验证上面的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。 为模式属性(在Type1中)指定“ oneof”是否意味着它必须包含模式属性?有没有办法使该对象在模式中是可选的?
答案 0 :(得分:0)
这里很少有问题和误解。没关系。
我将您的架构和JSON实例放入online validator中。我发现这种超级有用的功能可以立即获得有关验证失败原因的反馈。
您想采用的方法是正确的,但是实现有些微。
在完成所有定义后,从patternProperties
开始,您已声明每个属性(与模式匹配)必须具有作为对象的值。好。该对象必须是您正确引用的Type1
。
在Type1
的定义中,您使用了properties
和patternProperties
。正在将patternProperties
应用于您在properties
中已指定的属性,因为它不排除在其他基于“属性”的关键字中找到的属性。 additionalProperties
(可能是模式)仅适用于properties
和patternProperties
尚未涵盖的那些属性。
带有“ additionalProperties”的验证仅适用于子级 与“属性”中的任何名称都不匹配的实例名称的值, 并且不匹配“ patternProperties”中的任何正则表达式。
Draft-7 validations additionalProperties
希望此说明以及指向在线验证器的链接(该链接可提供有用的验证失败消息)将使您能够继续进行自己的模式。当我看不到更多可能的实例json数据时,为您提供更正的架构会有些困难。