2013-04-25 16 views
12

Aşağıdaki JSON çıkış verileri:JSON Şemasını keyfi bir anahtar için nasıl tasarlarsınız?

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

çıkış basittir: tamsayı değeri ile ilişkili önemli bir [1], adı. anahtar adı değişmezse, ben kolayca buna benzer JSON Şeması elde edebilirsiniz: anahtar adı kendisi bilinmediği için

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

ve değişmeye devam, bunun için şema tasarımı var. Bildiğim tek şey anahtarın string ve 100'den fazla karakter içermemesidir. Değiştirmeye devam eden lable_name_xxx anahtarı için JSON Şemasını nasıl tanımlarım.

[1] değil seni Advanced Examples bölümünde uygun bir şeyler bulacaksınız json-schema.org On doğru terminolojiyi

+1

@Konrad'ın yanıtını kabul etmelisiniz. – jackr

cevap

20

kullanıyorum emin. Bir object içinde patternProperties tanımlayabilirsiniz.

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

düzenli ifade (label_name_[0-9]+)+ sizin ihtiyaçlarıyla uyumlu olmalıdır. JSON Şeması'nda düzenli ifadeler ^ ve $ ile açıkça ilişkilendirilmiştir. Normal ifadeler, en az bir özellik (+) olması gerektiğini tanımlar. Özellik,ve 0 ve 9 arasındaki bir sayıdan oluşur, ancak en az bir sayı ([0-9]+) olmalıdır, ancak bunların birçoğu da keyfi olabilir.

additionalProperties değerini false olarak ayarlayarak, nesne özelliklerini normal ifadeyle eşleşecek şekilde kısıtlar.

6

Konrad'ın yanıtının belirttiği gibi, patternProperties'u kullanın. Ancak, gerekli olmayan properties yerine kullanın ve Konrad'ın referans örneğinden çıkarak, / ile başlayan bir yolu beklediğini düşünüyorum. Aşağıdaki örnekte, regex .* desen eşleşmesi herhangi bir özellik adını kabul eder ve ben yalnızca "additionalProperties": false kullanarak dize veya null türlerine izin veriyorum.

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