2015-08-17 29 views
10

Chcę mieć schemat JSON o nieznanych nazwach właściwości w tablicy obiektów. Dobrym przykładem jest meta-dane na stronie internetowej:Schemat JSON o nieznanych nazwach właściwości

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

Wszelkie pomysły proszę, czy inny sposób, aby osiągnąć to samo?

+0

Proszę podać więcej szczegółów na temat tego, co chcesz osiągnąć –

+0

meta-danych jest tablicą obiektów, gdzie nie wiem możliwych nazw atrybutów obiektów –

+0

Jakie ograniczenia chcesz egzekwować do twoich nienazwanych właściwości? Czy chcesz, żeby miały jakiś typ, czy chcesz, żeby ich imiona miały jakiś wzór? Możesz mieć nieznane nazwy właściwości w schemacie JSON, pod warunkiem, że nie masz dodatkowych właściwości = fałsz – jruizaranguren

Odpowiedz

4

Można tworzyć ograniczenia dla właściwości nieokreślonych jawnie. Poniższy schemat wymusza „meta”, aby być tablicą obiektów, których właściwości są typu string:

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

W przypadku, gdy po prostu chcesz mieć tablicę łańcuchów, można użyć następującego schematu:

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

@jruizarangen - Twój pierwszy przykład powinien mieć '" type ":" object "' w schemacie 'items'. Własność "additionalProperties' nie określa typu, więc ciąg nadal będzie przekazywał ten schemat. – cloudfeet

+0

Dzięki, masz rację – jruizaranguren

+0

Dziękuję @jruizaranguren, to działa dla mnie. Chociaż jestem tym, który definiuje schemat, wybrałem inny sposób (zobacz odpowiedź) –

1

Rozwiązanie @jruizaranguren działa dla mnie. Choć jestem ten sam, który określa schemat, i wybrał inne rozwiązanie

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

I przekształcony obiekt do tablicy nazwa-wartość obiektów Przykładem ważnego JSON:

"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

Użyj patternProperties zamiast properties. W poniższym przykładzie wzór dopasowania regex .* akceptuje dowolną nazwę właściwości i dopuszczam typy string lub null tylko przy użyciu "additionalProperties": false.

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