簡體   English   中英

如何有條件地驗證arrays中嵌套文檔的JSON文檔?

[英]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

任何提示如何解決它?

非常感謝!

我找到了解決問題的方法。 但我相信一定有更好的解決方案。 所以仍然歡迎任何建議。

我的解決方法是定義兩種“類型”的數組項: ArrayItemArrayItemRequireKey 第二個與第一個具有相同的定義,只是字段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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM