глубоко вложенный валидатор JSON с использованием Цербера - PullRequest
2 голосов
/ 30 мая 2019

У меня глубоко вложенный JSON, который я пытаюсь проверить с помощью Цербера.Итак, у меня есть следующая структура: (ПРИМЕЧАНИЕ: предположим, что даже более глубокое гнездо)

Я создал свою схему для первого уровня, но я не могу понять, как идти глубже в json.Я не могу вручную написать схему глубины, потому что я не знаю, сколько уровней будет вниз по json.Как я понимаю, Цербер может обрабатывать вложенные jsons, но я не могу найти ссылки на код для этого конкретного случая.Есть идеи, как это реализовать?

{
"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 голосов
/ 02 июня 2019

Вы можете использовать реестр схем для схем со ссылками на себя:

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)
0 голосов
/ 30 мая 2019

Ключевое слово "$ ref", определенное в спецификации схемы JSON, может соответствовать вашим потребностям.

{
    "$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"
                }
            }
        }
    ]
}
...