2013-04-18 14 views
16

Sto utilizzando validictory per la convalida dei dati e dello schema JSON allegati. Funzionando finora.Convalida schema JSON con chiavi arbitrarie

Tuttavia il dizionario dei dati può avere chiavi stringa arbitrarie (diverse da "bp" ma). La chiave 'bp' nello schema qui è hard-coded ... può essere una stringa da una lista data (enum di stringa). Come aggiungo qui la definizione enum per il "primo livello" 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) 
+0

Puoi mostrarci come riprodurre il problema? Non vedo niente adesso. – jsalonen

+1

@jsalonen: il problema è che l'OP vuole convalidare l'input se la chiave di primo livello è qualcosa di diverso da 'bp'. Penso che la descrizione del problema sia abbastanza chiara e qualcuno con esperienza nello schema JSON dovrebbe essere in grado di aiutare. –

+0

Ah, giusto. Grazie. – jsalonen

risposta

29

Dipende esattamente da ciò che si sta tentando di fare.

Se si desidera che la stessa specifica, ma per una serie di proprietà, è possibile astrarre la definizione:

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

Se volete qualsiasi di immobili da seguire quello schema, è possibile utilizzare additionalProperties:

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

O una serie di proprietà (accompagnato da un modello) - per esempio, qualsiasi cosa minuscola:

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

Se si desidera limitare il numero di proprietà che possono essere definite, quindi è possibile utilizzare "maxProperties" (V4 della standard):

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

P.S. - nella v4 dello standard, "required" è un array. Infatti, anche in v3, il valore predefinito "richiesto" è false, quindi il tuo esempio non ne ha affatto bisogno

+2

patternProperties ha fatto il lavoro –

+0

Devo dire che se è un insieme fisso di possibili chiavi (ad esempio 10 o così), allora la prima opzione è probabilmente la più descrittiva. Tuttavia, se c'è una gamma infinita (o estremamente grande) di essi, quindi 'patternProperties' è sicuramente la strada da percorrere. – cloudfeet

Problemi correlati