2011-11-18 11 views
32

मैं सामान्य JSs-utils से node.js + json-schema.js का उपयोग कर अपने JSON API को सत्यापित करने का प्रयास कर रहा हूं। बस एक ही सत्यापन आसान था लेकिन एक दूसरे के संदर्भ में सक्षम करने के लिए कई स्कीमा फ़ाइलों को प्रबंधित करने का सही तरीका नहीं मिला।एकाधिक JSON स्कीमा फ़ाइलों का प्रबंधन कैसे करें?

मान लीजिए कि मुझे दो मॉडल & दो एपीआई मिल गए हैं।

// 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" } } 
    } 
} 

प्रत्येक स्कीमा को अलग फ़ाइल में विभाजित किया जाना चाहिए और ऑनलाइन होना चाहिए? या मैं नीचे की तरह एकल स्कीमा फ़ाइल में गठबंधन कर सकते हैं? यदि यह संभव है, तो मैं स्थानीय स्कीमा का संदर्भ कैसे दे सकता हूं?

// single schema file { 
    "book": { ... }, 
    "author": { ... }, 
    "authors": { ... }, 
    "books": { ... } } 

उत्तर

46

JSON स्कीमा में, आप या तो फ़ाइल प्रति एक स्कीमा रखा और फिर उनके यूआरएल (जहाँ आप उन्हें संग्रहीत), या id टैग के साथ एक बड़ा स्कीमा का उपयोग कर उन तक पहुँच सकते हैं।

यहाँ एक बड़ी फ़ाइल के लिए है:

{ 
    "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" 
     } 
    } 
} 

फिर आप उन उप स्कीमा (जो एक id साथ परिभाषित कर रहे हैं) में से एक करने के लिए अपने सत्यापनकर्ता संदर्भित कर सकते हैं।

अपने स्कीमा के बाहर से यह:

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

इस के बराबर है:

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

है & hellip;

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

या इस (अब भी अंदर से): जो बराबर है, अंदर से, इस के लिए है

{ "$ref": "#book" } 

अधिक जानकारी के लिए मेरी answer here देखें।

+0

क्या node.js में अलग स्कीमा फ़ाइलों के साथ ऑब्जेक्ट बनाने का कोई तरीका है? – uzay95

+1

@ uzay95 स्कीमा कक्षाएं नहीं हैं। किसी ऑब्जेक्ट की संरचना को परिभाषित करने और मान्य करने के लिए एक स्कीमा का उपयोग किया जाता है, एक वर्ग प्रारंभिक होने के बाद किसी ऑब्जेक्ट की संरचना को परिभाषित करता है। यदि आपको जेएस में कक्षाओं की आवश्यकता है, तो टाइपस्क्रिप्ट, एटस्क्रिप्ट या ES6 को देखने का प्रयास करें। या बस बाहरी फ़ाइल के भीतर एक मॉड्यूल या कन्स्ट्रक्टर फैक्ट्री विधि डालें जिसमें आप node.js. में शामिल होंगे। –

संबंधित मुद्दे