2013-04-25 13 views
12

że ma następujące dane wyjściowe: JSONJak zaprojektowałbyś schemat JSON dla dowolnego klucza?

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

wyjście jest prosta: klawisza [1] Nazwa związanego z wartością całkowitą. Jeśli klucz nazwa nie zmienia, mogę łatwo wymyślić JSON schematu podobnego do tego:

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

Ponieważ sama nazwa klucza nie jest znany i ciągle się zmienia, mam zaprojektować schemat do niego. Jedyne, co wiem, to klucz: string i nie więcej niż 100 znaków. Jak zdefiniować schemat JSON dla klucza lable_name_xxx, który ciągle się zmienia.

[1] Nie wiem, czy używam właściwej terminologii

+1

Powinieneś przyjąć odpowiedź @Konrada. – jackr

Odpowiedz

20

Na json-schema.org znajdziesz coś odpowiedniego w sekcji Advanced Examples. Możesz zdefiniować patternProperties wewnątrz object.

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

Wyrażenie regularne (label_name_[0-9]+)+ powinno pasować do twoich potrzeb. W JSON schematy wyrażeń regularnych są wyraźnie zakotwiczone z ^ i $. Wyrażenia regularne określają, że musi istnieć co najmniej jedna właściwość (+). Właściwość składa się z label_name_ i numeru między 0 i 9, podczas gdy musi istnieć co najmniej jeden numer ([0-9]+), ale może być również dowolna ich liczba.

Ustawienie additionalProperties na false ogranicza właściwości obiektu do dopasowania do wyrażenia regularnego.

6

Zgodnie z odpowiedzią Konrada, użyj patternProperties. Ale używaj zamiast properties, która nie jest potrzebna, i myślę, że Konrad właśnie wkleił swój referencyjny przykład, spodziewając się ścieżki zaczynającej się od /. W poniższym przykładzie wzorzec dopasowania regex .* akceptuje dowolną nazwę właściwości i dopuszczam typy łańcuchów lub wartości null tylko przy użyciu "additionalProperties": false.

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