Проверка 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)
Ответы
Ответ 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
, поэтому ваш пример вообще не нужен.