Validación de esquemas JSON con claves arbitrarias

Estoy utilizando validictory para validar los datos y el esquema JSON adjuntos. Trabajando hasta ahora.

Sin embargo, el diccionario de datos puede tener claves de cadena arbitrarias (que no sean ‘bp’ pero). La clave ‘bp’ en el esquema aquí está codificada … puede ser una cadena de una lista dada (enumeración de cadena). ¿Cómo agrego la definición de enumeración aquí para el “primer nivel” del 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) 

Depende exactamente de lo que estés tratando de hacer.

Si desea la misma especificación, pero para un rango de propiedades, puede abstraer la definición:

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

Si desea que alguna propiedad siga ese esquema, puede usar propiedades additionalProperties :

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

O un rango de propiedades (emparejado por un patrón) – por ejemplo, cualquier minúscula:

 { "type": "object", "patternProperties": { "^[az]+$": {...} } } 

Si desea limitar el número de propiedades que se pueden definir, entonces puede usar “maxProperties” (v4 del estándar):

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

PS: en v4 del estándar, “required” es una matriz. De hecho, incluso en v3, “requerido” por defecto es false , por lo que su ejemplo no lo necesita en absoluto