如何有条件地验证数组中嵌套文档的JSON文档?

q8l4jmvw  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(123)

下面是一个例子:

{
    "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测试我的模式
有什么建议吗?
多谢了!

3pmvbmvn

3pmvbmvn1#

我找到了一个解决问题的方法。但我相信一定有更好的解决办法。所以任何建议仍然是受欢迎的。
我的解决方法是定义两种“类型”的数组项: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 Schema版本。我必须使用2019-09才能让它运行。

相关问题