2013-04-25 6 views
12

Ho il seguente dati di uscita JSON:Come progettereste JSON Schema per una chiave arbitraria?

{ 
    "label_name_0" : 0, 
    "label_name_5" : 3, 
    . 
    . 
    . 
    "label_name_XXX" : 4 
} 

L'uscita è semplice: una chiave [1] nome associato valore intero. Se il nome della chiave non cambia, posso facilmente venire con JSON Schema simile a questo:

{ 
     "type": "array" 
     "title": "Data output", 
     "items" :{ 
      "properties": { 
       "label_name": { 
        "type": "integer", 
        "default": 0, 
        "readonly": True, 
      } 
     } 
    }, 

Dal momento che il nome della chiave stessa non è nota e continuare a cambiare, devo progettare schema per esso. L'unica cosa che so è che la chiave è string e non più di 100 caratteri. Come posso definire uno schema JSON per la chiave lable_name_xxx che continua a cambiare.

[1] Non sono sicuro se sto usando la terminologia giusta

+1

È necessario accettare la risposta di @Konrad. – jackr

risposta

20

Su json-schema.org troverete qualcosa di appropriato nella sezione Advanced Examples. È possibile definire patternProperties all'interno di object.

{ 
    "type": "object", 
    "properties": { 
     "/": {} 
    }, 
    "patternProperties": { 
     "^(label_name_[0-9]+)+$": { "type": "integer" } 
    }, 
    "additionalProperties": false, 
} 

L'espressione regolare (label_name_[0-9]+)+ dovrebbe soddisfare le vostre esigenze. Nello schema JSON le espressioni regolari sono esplicitamente ancorate a ^ e $. Le espressioni regolari definiscono che deve esserci almeno una proprietà (+). La proprietà è composta da label_name_ e un numero compreso tra 0 e 9 mentre deve esserci almeno un numero ([0-9]+), ma possono anche essere molti di loro arbitrari.

Impostando additionalProperties su false, le proprietà dell'oggetto vengono confrontate con l'espressione regolare.

6

Come ha dichiarato la risposta di Konrad, utilizzare patternProperties. Ma usare al posto di properties, che non è necessario, e penso che Konrad abbia appena incollato il suo esempio di riferimento che si aspettava un percorso che inizia con /. Nell'esempio seguente, il modello corrisponde a regex .* accetta qualsiasi nome di proprietà e sto consentendo i tipi di stringa o null solo utilizzando "additionalProperties": false.

"patternProperties": { 
    "^.*$": { 
     "anyOf": [ 
     {"type": "string"}, 
     {"type": "null"} 
     ] 
    } 
    }, 
    "additionalProperties": false 
Problemi correlati