2015-08-17 11 views
10

Desidero avere uno schema JSON con nomi di proprietà sconosciute in una matrice di oggetti. Un buon esempio è il meta-dati di una pagina web:Schema JSON con nomi di proprietà sconosciute

 "meta": { 
     "type": "array", 
     "items": { 
      "type": "object", 
      "properties": { 
      "unknown-attribute-1": { 
       "type": "string" 
      }, 
      "unknown-attribute-2": { 
       "type": "string" 
      }, 
      ... 
      } 
     } 
     } 

tutte le idee soddisfanno, o altro modo per raggiungere lo stesso?

+0

Si prega di fornire maggiori dettagli su ciò che si vuole raggiungere –

+0

La meta-dati è un array di oggetti, dove io non conosco i possibili nomi degli attributi degli oggetti –

+0

Quali vincoli vuoi far rispettare alle tue proprietà senza nome? Vuoi che abbiano qualche tipo, o vuoi che i loro nomi seguano qualche schema? Puoi avere nomi di proprietà sconosciute nello schema JSON se non hai additionalProperties = false – jruizaranguren

risposta

4

È possibile creare vincoli sulle proprietà non definite in modo esplicito. Il seguente schema impone "meta" di essere un array di oggetti le cui proprietà sono di tipo stringa:

{ 
    "properties" : { 
     "meta" : { 
      "type" : "array", 
      "items" : { 
       "type" : "object", 
       "additionalProperties" : { 
        "type" : "string" 
       } 
      } 
     } 
    } 
} 

Nel caso in cui si vogliono solo avere un array di stringhe, è possibile utilizzare il seguente schema:

{ 
    "properties" : { 
     "meta" : { 
      "type" : "array", 
      "items" : { 
       "type" : "string" 
      } 
     } 
    } 
} 
+1

@jruizarangen - il tuo primo esempio dovrebbe avere '" tipo ":" oggetto "' nello schema 'items'. 'additionalProperties' da solo non specifica un tipo, quindi una stringa passerebbe comunque tale schema. – cloudfeet

+0

Grazie, hai ragione – jruizaranguren

+0

Grazie @jruizaranguren, funziona per me. Sebbene io sia lo stesso che definisce lo schema, ho scelto un altro modo (vedi risposta) –

1

La soluzione di @jruizaranguren funziona per me. Anche se sono gli stessi che definisce lo schema, ho scelto un'altra soluzione

"meta": { 
     "type": "array", 
     "items": { 
      "type": "array", 
      "items": { 
      "type": "object", 
      "properties": { 
       "name": { 
       "type": "string" 
       }, 
       "value": { 
       "type": "string" 
       } 
      } 
      } 
     } 
     } 

ho convertito l'oggetto in un array di nome-valore oggetti Un esempio di un JSON valido:

"meta": [ 
    [ 
     { 
     "name": "http-equiv", 
     "value": "Content-Type" 
     }, 
     { 
     "name": "content", 
     "value": "text/html; charset=UTF-8" 
     } 
    ], 
    [ 
     { 
     "name": "name", 
     "value": "author" 
     }, 
     { 
     "name": "content", 
     "value": "Astrid Florence Cassing" 
     } 
    ] 
    ] 
9

Uso patternProperties anziché properties. Nell'esempio riportato di seguito, la corrispondenza del modello con espressione regolare .* accetta qualsiasi nome di proprietà e sono consentiti i tipi di string o null solo utilizzando "additionalProperties": false.

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