[英]How to validate JSON document with nested documents in arrays conditionally?
我有以下示例 JSON 文檔:
{
"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 模式來檢查以下條件:如果“level0key1”=“foo0”,“level0array1”的每個文檔都必須有一個字段“level1key1”。
到目前為止,我所擁有的是以下 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”數組中的第一次檢查僅用於測試目的,並且按預期工作。 第二個總是失敗。 我想尋址數組中的字段的語法是錯誤的。 我嘗試使用星號作為通配符並使用點而不是斜線。
我還嘗試將條件放在“level0array1”定義中。 但我也沒有讓這個工作。
為了測試我的架構,我使用了 https://www.jsonschemavalidator.net
任何提示如何解決它?
非常感謝!
我找到了解決問題的方法。 但我相信一定有更好的解決方案。 所以仍然歡迎任何建議。
我的解決方法是定義兩種“類型”的數組項: ArrayItem
和ArrayItemRequireKey
。 第二個與第一個具有相同的定義,只是字段level1key1
是必需的。 在此之后,我可以使用 if/then/else 將一種或另一種類型的條件用於我的/任何其他字段(具有相同的層次結構級別)。
新架構如下所示:
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"title": "test",
"type": "object",
"required": [],
"properties": {
"level0key1": {
"type": "string"
},
"level0key2": {
"type": "string"
}
},
"allOf": [{
"if": {
"properties": {
"level0key1": {"const": "foo0"}
},
"required": ["level0key1"]
},
"then": {
"required": ["level0key2"]
}
}, {
"if": {
"properties": {
"level0key1": {"const": "foo0"}
},
"required": ["level0key1"]
},
"then": {
"properties": {
"level0array1": {
"type": "array",
"items": {
"$ref": "#/$defs/ArrayItemRequireKey"
}
}
},
"required": ["level0array1"]
},
"else": {
"properties": {
"level0array1": {
"type": "array",
"items": {
"$ref": "#/$defs/ArrayItem"
}
}
},
"required": ["level0array1"]
}
}
],
"$defs": {
"ArrayItem": {
"type": "object",
"properties": {
"level1key1": {
"type": "string"
},
"level1key2": {
"type": "string"
}
}
},
"ArrayItemRequireKey": {
"allOf": [{ "$ref": "#/$defs/ArrayItem" }],
"required": ["level1key1"]
}
}
}
請注意:在我的情況下/在我的庫中,這不適用於 2020-12 的 json 架構版本。 我必須使用 2019-09 才能運行它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.