我正在尝试编写 JSON 模式来验证包含以下内容的 JSON 文件:
{
"number" : "1",
"rootProperty":
[
{
"property1":"value1"
},
{
"property2":"value2"
}
]
}
该架构应处理以下场景:
有人可以帮忙吗?
此外,模式是否是处理这种深度验证的正确方法?
当我尝试对 rootProperty 数组使用“items”关键字并在所需条件内提到 property1 和 property2 时,会对数组的每个元素评估这些条件,这会导致错误,指出第一个元素中缺少 property2,第二个元素中缺少 property1元素。 此外,使用“包含”会导致错误,指出对象包含无法针对任何属性或附加属性进行评估的属性。
这就是我要做的工作:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"number": { "type": "string" },
"rootProperty": {
"type": "array",
"items": {
"type": "object",
"oneOf": [
{ "required": ["property1"] },
{ "required": ["property2"] }
]
},
"allOf": [
{
"contains": { "required": ["property1"] },
"maxContains": 1
},
{
"contains": { "required": ["property2"] },
"maxContains": 1
}
]
}
},
"required": ["number", "rootProperty"]
}
这适用于多个部分:
rootProperty
被定义为一个数组,其中所有项目必须具有 property1
或 property2
,但不能同时具有两者(通过 oneOf
和 required
子模式定义)。allOf
和 contains
子模式。 这意味着所有子模式都必须通过,并且每个子模式表示数组必须包含具有特定属性的对象。 maxContains
确保数组中只有一个对象包含该属性。但是有一个问题:
maxContains
直到 2019-09 才定义,因此您需要使用它或 2020-12 来完成这项工作。 (您在对托尼的评论中提到了草案 7。恐怕您无法使用草案 7 来完成这项工作。)
请随意使用我的在线验证器进行测试:https://json-everything.net/json-schema。