使用cerberus的深度嵌套json验证器

时间:2019-05-30 01:13:17

标签: json nested cerberus

我有一个深层嵌套的json,我正在尝试用cerberus进行验证。 因此,我具有以下结构:(注意:假设有更深的嵌套)

我为第一级创建了架构,但是我无法弄清楚如何在json中更深入。我无法手动编写深度模式,因为我不知道json会降多少级。 据我了解,cerberus可以处理嵌套的json,但是我找不到这种确切情况的任何代码引用。知道如何实现吗?

{
"product_number": "123",
"product_version": "ABC",
"subproducts": [
    {
        "product_number": "444",
        "product_version": "ASD",
        "subproducts": [
            {
                "product_number": "666",
                "product_version": "FFF",
                "subproducts": [
                    {
                        "product_number": "888",
                        "product_version": "JUN",
                        "subproducts": []
                    },
                    {
                        "product_number": "644",
                        "product_version": "GYB",
                        "subproducts": [
                            {
                                "product_number": "8890",
                                "product_version": "KLM",
                                "subproducts": []
                            }
                        ]
                    }
                ],
            }
        ],
    }
],}

2 个答案:

答案 0 :(得分:0)

JSON模式规范中定义的“ $ ref”关键字可能满足您的需求。

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "required": ["product_number", "product_version", "subproducts"],
    "properties": {
        "product_number": {
            "type": "string"
        },
        "product_version": {
            "type": "string"
        },
        "subproducts": {
            "type": "array",
            "items": {
                "$ref": "#"
            }
        }
    }
}

如果仅在同级"product_number"不为空的情况下需要属性"product_version""subproducts",则应按如下所示修改JSON模式:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "required": ["subproducts"],
    "properties": {
        "subproducts": {
            "type": "array",
            "items": {
                "$ref": "#"
            }
        }
    },
    "anyOf": [
        {
            "properties": {
                "subproducts": {
                    "maxItems": 0
                }
            }
        },
        {
            "required": ["product_number", "product_version"],
            "properties": {
                "subproducts": {
                    "minItems": 1
                },
                "product_number": {
                    "type": "string"
                },
                "product_version": {
                    "type": "string"
                }
            }
        }
    ]
}

答案 1 :(得分:0)

您可以将schema registry用于自引用架构:

from cerberus import schema_registry, Validator

product_schema = {
    "product_number": {"type": "string", "regex": "\d+"},
    "product_version": {"type": "string", "regex": "[A-Z]+"},
    "subproducts": {"type": "list", "schema": "product_schema"}
}

schema_registry.add("product_schema", product_schema)
validator = Validator(product_schema)