глубоко вложенный валидатор json с использованием cerberus

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

Я создал свою схему для первого уровня, но не могу понять, как углубиться в json. Я не могу вручную написать схему глубины, потому что не знаю, на сколько уровней будет json. Насколько я понимаю, cerberus может обрабатывать вложенные 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": []
                            }
                        ]
                    }
                ],
            }
        ],
    }
],}

person hashguard    schedule 30.05.2019    source источник


Ответы (2)


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

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)
person funky-future    schedule 02.06.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"
                }
            }
        }
    ]
}
person leadpony    schedule 30.05.2019
comment
я в основном нацелен на CERBERUS только здесь. мой json немного сложнее, чем то, что я опубликовал. поле subproducts представляет собой массив, и ТОЛЬКО если оно НЕ ПУСТО, я должен проверить, присутствуют ли другие поля на том же уровне, что и subproducts. Это пользовательское правило, которое я смог создать только в Cerberus. если вы не знаете, как это сделать в схеме json??? - person hashguard; 31.05.2019
comment
хорошо, я определенно не могу использовать jsonschema. он несовместим с другими моими библиотеками. я могу использовать его только до draft4. - person hashguard; 01.06.2019
comment
Извините, но я не знаком с Cerberus и его уникальным языком схемы. Поэтому я не могу вам помочь. - person leadpony; 02.06.2019