下面是一个例子:
{
"level0key1": "foo0",
"level0key2": "bar0",
"level0array1": [
{
"level1key1": "foo1-0",
"level1key2": "bar1-0"
},
{
"level1key1": "foo1-1",
"level1key2": "bar1-1"
}
],
"level0doc1": {
"dockey1": "foo-doc-1",
"dockey2": "foo-doc-2"
}
}
我想构建一个JSON架构来检查以下条件:在“level 0 key 1”=“foo 0”的情况下,“level 0array 1”的每个文档必须具有字段“level 1 key 1”。
到目前为止,我已经有了以下JSON模式:
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"title": "test",
"type": "object",
"required": [],
"properties": {
"level0key1": {
"type": "string"
},
"level0key2": {
"type": "string"
},
"level0array1": {
"type": "array",
"properties": {
"level1key1": {
"type": "string"
},
"level1key2": {
"type": "string"
}
}
}
},
"allOf": [{
"if": {
"properties": {
"level0key1": { "const": "foo0" }
},
"required": ["level0key1"]
},
"then": {
"required": ["level0key2"]
}
}, {
"if": {
"properties": {
"level0key1": { "const": "foo0" }
},
"required": ["level0key1"]
},
"then": {
"required": ["level0array1/[]/level1key1"]
}
}
]
}
“allOf”数组中的第一个检查仅用于测试目的,并按预期工作。第二个检查总是失败。我猜想在数组中寻址字段的语法是错误的。我尝试将星号用作通配符,并使用点代替斜线。
我也试着把条件放在“level 0array 1”定义中。但是我也不能让这个工作。
我使用https://www.jsonschemavalidator.net测试我的模式
有什么建议吗?
多谢了!
1条答案
按热度按时间3pmvbmvn1#
我找到了一个解决问题的方法。但我相信一定有更好的解决办法。所以任何建议仍然是受欢迎的。
我的解决方法是定义两种“类型”的数组项:
ArrayItem
和ArrayItemRequireKey
。第二个与第一个定义相同,除了字段level1key1
是必需的。在此之后,我可以使用if/then/else来使用条件中的一个或另一个类型到我的/任何其他字段(具有相同的层次结构级别)。新模式如下所示:
请注意:在我的情况下/使用我的库,这不适用于2020-12的JSON Schema版本。我必须使用2019-09才能让它运行。