2012-05-30 6 views
22

La mia stringa JSON sarebbe essere formattato come:Come scrivere uno schema JSON per array di oggetti?

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     }, 
     { 
      "c":{"cx":4} 
     } 
    ] 
} 

L'array data contiene molti a e b e c. E nessun altro tipo di oggetti.

Se count==0, data deve essere un array vuoto [].

Sto usando https://github.com/hoxworth/json-schema per convalidare tali oggetti JSON in Ruby.

require 'rubygems' 
require 'json-schema' 

p JSON::Validator.fully_validate('schema.json',"test.json") 

Il schema.json è:

{ 
    "type":"object", 
    "$schema": "http://json-schema.org/draft-03/schema", 
    "required":true, 
    "properties":{ 
    "count": { "type":"number", "id": "count", "required":true }, 
    "data": { "type":"array", "id": "data", "required":true, 
     "items":[ 
      { "type":"object", "required":false, "properties":{ "a": { "type":"object", "id": "a", "required":true, "properties":{ "ax": { "type":"number", "id": "ax", "required":true } } } } }, 
      { "type":"object", "required":false, "properties":{ "b": { "type":"object", "id": "b", "required":true, "properties":{ "bx": { "type":"number", "id": "bx", "required":true } } } } }, 
      { "type":"object", "required":false, "properties":{ "c": { "type":"object", "id": "c", "required":true, "properties":{ "cx": { "type":"number", "id": "cx", "required":true } } } } } 
     ] 
    } 
    } 
} 

Ma questo per test.json passerà la convalida, mentre suppongo che dovrebbe fallire:

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     }, 
     { 
      "c":{"cx":2} 
     }, 
     { 
      "c": {"z":"aa"} 
     } 
    ] 
} 

E questo come test.json fallirà, mentre suppongo dovrebbe passare:

{ 
    "count":3, 
    "data":[ 
     { 
      "a":{"ax":1} 
     }, 
     { 
      "b":{"bx":2} 
     } 
    ] 
} 

Sembra che lo schema errato convalidi che l'array data contiene a,b,c una volta.

Quale deve essere lo schema corretto?

+0

@Phrogz Ho aggiornato la questione. Puoi vedere l'esempio. –

risposta

30

Da JSON schema spec, sezione 5.5. articoli:

Quando questo valore di attributo è un array di schemi e l'istanza
valore è un array, ogni posizione nell'array dell'istanza deve corrispondere
allo schema nella posizione corrispondente per questa matrice. Questo
ha chiamato la tipizzazione della tupla.

La definizione dello schema richiede che i primi tre elementi dell'array corrispondano esattamente agli elementi "a", "b" e "c". Se items è vuoto, qualsiasi elemento dell'array è consentito. Allo stesso modo, se additionalItems è vuoto, è consentito qualsiasi elemento di array aggiuntivo.

per ottenere ciò che si desidera, è necessario specificare "additionalItems": false e per la items, penso che il seguente (un po 'accorciato dai vostri definizioni) dovrebbe funzionare:

"items": { 
    "type": [ 
    {"type":"object", "properties": {"a": {"type": "object", "properties": {"ax": { "type":"number"}}}}}, 
    {"type":"object", "properties": {"b": {"type": "object", "properties": {"bx": { "type":"number"}}}}}, 
    {"type":"object", "properties": {"c": {"type": "object", "properties": {"cx": { "type":"number"}}}}} 
    ] 
} 
+1

questo funziona per me, grazie –

+1

È questo il modo corretto di usare "tipo" qui? Il valore di "items" non dovrebbe essere invece l'array? –

+0

@Confusion, mi dispiace per averlo riaperto, ma la soluzione proposta non funziona; quindi per esempio dovrei avere più di 3 degli oggetti proposti nella matrice 'data', quindi la convalida dello schema fallisce ... qualche idea su come risolverlo? – jtimz