2013-08-22 11 views
20

JSON şema (taslak-04) 'de tanımları nasıl kullanılır:Ben örnek aşağıdaki benzer ile çalışıyorum dinlenme hizmeti yanıtı, sadece burada 3 alanları dahil ettik ama çok daha fazla vardır

{ 
    "results": [ 
     { 
      "type": "Person", 
      "name": "Mr Bean", 
      "dateOfBirth": "14 Dec 1981" 
     }, 
     { 
      "type": "Company", 
      "name": "Pi", 
      "tradingName": "Pi Engineering Limited" 
     } 
    ] 
} 

ben yukarıda (taslak-04) açıkça belirtmek hangi bir JSON şema dosyası yazmak istiyorum:

if type == Person then list of required properties is ["type", "name", "dateOfBirth", etc] 
OR 
if type == "Company" then list of required properties is ["type", "name", "tradingName", etc] 

Ancak bunu nasıl herhangi belgelerine veya örnek bulamıyorum.

anda benim JSON şema aşağıdaki gibidir:

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "type": "object", 
    "required": ["results" ], 
    "properties": { 
     "results": { 
      "type": "array", 
      "items": { 
       "type": "object", 
       "required": ["type", "name"], 
       "properties": { 
        "type": { "type": "string" }, 
        "name": { "type": "string" }, 
        "dateOfBirth": { "type": "string" }, 
        "tradingName": { "type": "string" } 
       } 
      } 
     } 
    } 
} 

Herhangi işaretçiler/Bu nasıl işlemesi gerektiğini örnekler.

+0

: Ama http://usingjsonschema.com kitapta mülkiyet ve tanımı hem bağımlılıkları açıkladı: Tür Kişi MyObject öğesini genişletir, Şirket MyObject öğesini genişletir ve ana şemanda MyObject türünde bir dizi tanımla MyObject –

+0

JSONSchema'nın XSD'ye ne kadar benzediğini bilmiyorum, ancak XSD hakkında ne hatırlayabildiğimden ortak bir yere ihtiyacınız yok. nesneniz için süper sınıf. Şemalar içinde mirasınızı tercih edersiniz. Örneğinizdeki şema ve şirket şemasının yerini alabilmesi için ana şemanızdaki soyut bir yer tutucu. – atomman

+0

Bağımlılıkların da 3. maddede olduğunu görüyorum. Hiç kimse 3. ve 4. taslaklar arasındaki bağımlılıklar ile ilgili herhangi bir farklılığı açıklıyor mu? – Relequestual

cevap

30

Önerilen yaklaşımın, Json-Schema web, Example2'da gösterilen yöntem olduğunu düşünüyorum. "Değere göre" şemalarını seçmek için bir numara kullanmanız gerekir.

{ 
    "type": "object", 
    "required": [ "results" ], 
    "properties": { 
     "results": { 
      "type": "array", 
      "items": { 
       "oneOf": [ 
        { "$ref": "#/definitions/person" }, 
        { "$ref": "#/definitions/company" } 
       ] 
      } 
     } 
    }, 
    "definitions": { 
     "person": { 
      "properties": { 
       "type": { "enum": [ "person" ] }, 
       "name": {"type": "string" }, 
       "dateOfBirth": {"type":"string"} 
      }, 
      "required": [ "type", "name", "dateOfBirth" ], 
      "additionalProperties": false 
     }, 
     "company": { 
      "properties": { 
       "type": { "enum": [ "company" ] }, 
       . . . 
      }   
     } 
    } 
} 
+1

Sadece sonuç dizisi özelliğinin bazı bilinmeyen alt türleri olduğunu biliyorsanız, "Parti" diyorsanız, ne yaparsınız? ilgili soru burada yayınlanmıştır http://stackoverflow.com/questions/19416873/how-to-tell-json-schema-validator-to-pick-schema-from-property-value :) – redben

9

Maalesef

Ben noktayı alamadım: Senin durumunda bu gibi bir şey olurdu. Soru, son JSON Şeması belirtiminin bir parçası olan 'bağımlılıklar' anahtar sözcüğü ile ilgili değil mi?

ben kabul edilen yanıt (?) Içinde 'bağımlılıkları' bulmuyorum

kısaca son taslağında açıklanır. (Bkz sayfa 30 açıklanabilir)

http://usingjsonschema.com/assets/UsingJsonSchema_20140814.pdf

sayfa 29 de başlangıç ​​Sana miras ile bu tarif gerektiğini düşünüyorum

"dependencies": { 
    "shipTo":["shipAddress"], 
    "loyaltyId":["loyaltyBonus"] 
} 
+0

Merhaba Sebastian, ** bağımlılıkları kullanma * * Yukarıdaki kullanım durumuna ulaşmak mümkün. [Soru-tıkla lütfen] (http://stackoverflow.com/questions/36830827/conditional-json-schema-validation-based-on-property-value). Başka bir mülkün değerine göre gerekli alanı yapmak mümkün mü? Bağlantıdaki soruya cevap vermeniz harika olurdu. Sağol Harry. – Harry

+0

@Harry Gerçekten buna ihtiyacım var mı? "Jason" tarafından sorulduktan birkaç dakika sonra cevap mükemmel! (sorunuza bakın) – sebilasse

+1

@SebastianLasse, belki de başlık kafa karıştırıcıdır, ancak lütfen orijinal soru metnini okuyunuz, sonra bunu açıkça belirtin ve cevabın soru gereksinimlerini çözdüğünü göreceksiniz. Soru, json şema bağımlılıkları anahtar sözcüğünün kullanımı ile ilgili değildir. Başlığı geliştirmek için çekinmeyin. – jruizaranguren

İlgili konular