Jsonschema, проверка ключей объекта с помощью пользовательской функции

Я использую python-jsonschema для проверки json. У меня есть объект с локализованными текстами, которые указаны внутри ключей кода языка rfc1766 следующим образом:

"Description": {
    "en": "English Description",
    "sv": "Swedish Description",
    "fr": "French Description"
},

я прочитал в документации, что могу использовать атрибут 'format' для проверки пользовательского формата с помощью функции. Итак, я написал метод, который принимает строку в качестве параметра и возвращает True, если это строка языка RFC1766.

@_checks_drafts('rfc1766lang')
def rfc1766lang(instance):
    """some logic, return True if rfc1766"""

Однако я не смог найти ни одного примера того, как применить это для проверки ключа объекта, а не значения.

Это возможно?

Я пробовал что-то вроде ниже, но мне не удалось

rfc1766_string_schema_v2 = {
    'type': 'object',
    'format': 'rfc1766lang',    
    'additionalProperties': False
}

Я знаю, что было бы намного проще, если бы у меня была строка json следующим образом. Однако пока это не вариант.

"Description": [{
    "lan": "en",
    "text": "Description in English"
}, {
    "lan": "sv",
    "name": "Description in Swedish"
}]

person Faruk Sahin    schedule 11.10.2013    source источник
comment
Я даже не могу найти, как применить вашу пользовательскую проверку формата к значению, это мне немного помогло бы. Ссылка на предоставленную вами документацию только показывает, как использовать предопределенные форматы.   -  person kev    schedule 06.01.2017


Ответы (1)


Это очень хороший и актуальный вопрос, потому что он фактически является частью предлагаемый синтаксис для v5, так что официальная мета-схема также должна учитывать это.

Схема JSON не может указывать «формат» для ключей объекта. Единственная «проверочная» схема JSON, поддерживаемая для ключей объекта, — это patternProperties, которая предоставляет регулярное выражение.

Для языковых кодов лучшее, что вы можете сделать, это, вероятно, что-то вроде:

{
    "type": "object",
    "patternProperties": {
        "^[a-zA-Z]+(-[a-zA-Z]+)*$": {...}
    },
    "additionalProperties": false
}

Это ограничило бы данные, чтобы были разрешены только свойства, соответствующие этому шаблону, но, боюсь, это не полная проверка, которую вы ищете.

person cloudfeet    schedule 12.10.2013