Проверка JSON-схемы с помощью произвольных ключей - программирование
Подтвердить что ты не робот

Проверка JSON-схемы с помощью произвольных ключей

Я использую validictory для проверки прикрепленных данных и схемы JSON. Работаем до сих пор.

Однако словарь данных может иметь произвольные строковые ключи (другие, чем "bp", но). Ключ "bp" в схеме здесь жестко закодирован... это может быть строка из данного списка (перечисление строки). Как добавить определение перечисления здесь для "первого уровня" dict.

import json
import validictory

data = {'bp': [{'category': 'bp',
         'created': '2013-03-08T09:14:48.148000',
         'day': '2013-03-11T00:00:00',
         'id': 'dc049c0e-d19a-4e3e-93ea-66438a239712',
         'unit': 'mmHg',
         'value': 147.0,
         'value2': 43.0}]}


schema = {
    "type":"object",
    "properties":{
        "bp": {
            "type":"array",
            "required":False,
            "items":
                {
                    "type":"object",
                    "required":False,
                    "properties":{
                        "category": {
                            "type":"string",
                            "default": "bp",
                            "required":False
                        },
                        "created": {
                            "type":"string",
                            "default": "2013-03-08T09:14:48.148000",
                            "required":False
                        },
                        "day": {
                            "type":"string",
                            "default": "2013-03-11T00:00:00",
                            "required":False
                        },
                        "id": {
                            "type":"string",
                            "default": "dc049c0e-d19a-4e3e-93ea-66438a239712",
                            "required":False
                        },
                        "unit": {
                            "type":"string",
                            "default": "mmHg",
                            "required":False
                        },
                        "value2": {
                            "type":"number",
                            "default":43,
                            "required":False
                        },
                        "value": {
                            "type":"number",
                            "default":147,
                            "required":False
                        }
                    }
                }


        }
    }
}

validictory.validate(data,schema)
4b9b3361

Ответ 1

Это зависит от того, что вы пытаетесь сделать.

Если вам нужна одна и та же спецификация, но для ряда свойств вы можете абстрагироваться от определения:

{
    "type": "object",
    "properties": {
        "bp": {"$ref": "#/definitions/categoryList"},
        "foo": {"$ref": "#/definitions/categoryList"},
        "bar": {"$ref": "#/definitions/categoryList"}
    },
    "definitions": {
        "categoryList": {...}
    }
}

Если вы хотите, чтобы какие-либо свойства соответствовали этой схеме, вы можете использовать additionalProperties:

{
    "type": "object",
    "additionalProperties": {...}
}

Или диапазон свойств (соответствующий шаблону) - например, что-нибудь в нижнем регистре:

{
    "type": "object",
    "patternProperties": {
        "^[a-z]+$": {...}
    }
}

Если вы хотите ограничить количество свойств, которые могут быть определены, вы можете использовать "maxProperties" (только для версии v4):

{
    "type": "object",
    "additionalProperties": {...},
    "maxProperties": 1
}

P.S. - в v4 стандарта "требуется" - массив. Фактически даже в v3 "требуется" по умолчанию используется false, поэтому ваш пример вообще не нужен.