2011-11-18 30 views
32

JSON API'm, commonjs-utils'den node.js + json-schema.js'yi kullanarak doğrulamaya çalışıyorum. Yalnızca tek geçerlilik kolaydı, ancak birbirini referans vermek için birden çok şema dosyasını nasıl yönetebileceğimizi doğru bir şekilde bulamadı.Birden çok JSON şema dosyası nasıl yönetilir?

İki Model & iki API aldığımı varsayalım.

// book 
{ 
    "type": "object", 
    "properties": { 
     "title": { "type": "string" }, 
     "author": { "type": "string" } 
    } 
} 
// author 
{ 
    "type": "object", 
    "properties": { 
     "first_name": { "type": "string" }, 
     "last_name": { "type": "string" } 
    } 
} 
// authors API 
{ 
    "type": "array", 
    "items": { "$ref": "author" } 
} 
// books API: list of books written by same author 
{ 
    "type": "object", 
    "properties": { 
    "author": { "$ref": "author" } 
    "books": { "type": "array", "items": { "$ref": "book" } } 
    } 
} 

Her bir şema ayrı bir dosyaya bölünmeli ve çevrimiçi olmalıdır? Ya da aşağıdaki gibi tek bir şema dosyasına birleştirebilir miyim? Mümkünse, yerel şemaya nasıl başvurabilirim?

JSON şemaları yılında
// single schema file { 
    "book": { ... }, 
    "author": { ... }, 
    "authors": { ... }, 
    "books": { ... } } 

cevap

46

, dosyanın başına bir şema koymak ve daha sonra (onları saklanan) URL'yi veya id etiketleri ile büyük bir şema kullanarak bunları erişebilir ya. İşte

büyük bir dosya içindir:

{ 
    "id": "#root", 
    "properties": { 
     "author": { 
      "id": "#author", 
      "properties": { 
       "first_name": { 
        "type": "string" 
       }, 
       "last_name": { 
        "type": "string" 
       } 
      }, 
      "type": "object" 
     }, 
     // author 
     "author_api": { 
      "id": "#author_api", 
      "items": { 
       "$ref": "author" 
      }, 
      "type": "array" 
     }, 
     // authors API 
     "book": { 
      "id": "#book", 
      "properties": { 
       "author": { 
        "type": "string" 
       }, 
       "title": { 
        "type": "string" 
       } 
      }, 
      "type": "object" 
     }, 
     // books API: list of books written by same author 
     "books_api": { 
      "id": "#books_api", 
      "properties": { 
       "author": { 
        "$ref": "author" 
       }, 
       "books": { 
        "items": { 
         "$ref": "book" 
        }, 
        "type": "array" 
       } 
      }, 
      "type": "object" 
     } 
    } 
} 

Ardından (bir id ile tanımlanır) o alt şemalardan birine sizin doğrulayıcı başvurabilir. senin şemanın Dışarıdan

bu:

{ "$ref": "url://to/your/schema#root/properties/book" } 

bu eşdeğerdir:

{ "$ref": "url://to/your/schema#book" } 

& hellip; İçten, buna eşdeğer olan:

{ "$ref": "#root/properties/book" } 

veya bu (hala içeriden):

{ "$ref": "#book" } 

fazla bilgi için benim answer here bakınız.

+0

node.js'de ayrılmış şema dosyalarıyla nesneyi oluşturmanın bir yolu var mı? – uzay95

+1

@ uzay95 şemaları sınıflar değildir. Bir nesnenin yapısını tanımlamak ve doğrulamak için kullanılan bir şema, bir nesnenin başlatılmasından sonra bir yapının yapısını tanımlar. Js'de sınıflara ihtiyacınız varsa, Typescript, AtScript veya ES6'ya bakmayı deneyin. Veya sadece bir modül veya kurucu fabrika yöntemini node.js. içerisine ekleyeceğiniz harici bir dosyaya koyun. –

İlgili konular