2011-11-20 20 views
5

से संबंधित कुछ प्रश्न मैं जेसन के लिए नोब हूं। मेरे रीस्टफुल एपीआई के परिणाम (जैसे जेएसओएन) के प्रारूप को परिभाषित करते समय, मुझे लगा कि इसे अपने JSON schema के रूप में दस्तावेज करना आसान होगा। एक लिखते समय मेरे पास कुछ प्रश्न थे:कस्टम जेसन स्कीमा

  1. मेरे परिणाम में JSON, मैं teh स्कीमा के लिए यूआरआई कैसे निर्दिष्ट करूं? --edit-- क्या यह $schema विशेषता का उपयोग कर रहा है?
  2. क्या JSON स्कीमा संस्करण के लिए कोई सम्मेलन/दिशानिर्देश हैं? क्या कुछ विशेषताएं हैं जिन्हें मुझे अपनी स्कीमा के अंदर विशेषताओं के रूप में परिभाषित/परिभाषित किया जाना चाहिए? मैं JSON schema itself को $schema के मान के रूप में निर्दिष्ट यूआरआई को छोड़कर कोई संस्करण परिभाषित नहीं किया गया है।
  3. क्या मैं अपने एक बड़े JSON स्कीमा को कई छोटे में विभाजित कर सकता हूं और एक दूसरे में शामिल कर सकता हूं? सी ++ में # शामिल करें, फिर जेएसओएन में कई स्कीमा देखें जो मैंने परिणामस्वरूप उपयोगकर्ता को भेजा था।
  4. क्या मैं कुंजी "प्रकार" के लिए कस्टम मान परिभाषित कर सकता हूं? जैसे मैं इस तरह "तिथि" की परिभाषा का पुन: उपयोग करना चाहते हैं:

के बजाय गुण प्रदान करने के [इस लाइन पर ध्यान न दें, यह json निम्नलिखित के लिए काम स्वरूपण प्राप्त करने के लिए है ..]

{ 
    "date":{ 
     "type":"object", 
     "properties":{ 
      "month":{ 
       "type":"integer", 
       "minimum":1, 
       "maximum":12 
      }, 
      "year":{ 
       "type":"integer", 
       "minimum":0 
      } 
     } 
    }, 
    "personInfo":{ 
     "type":"object", 
     "properties":{ 
      "name":{ 
       "type":"string" 
      }, 
      "dateOfBirth":{ 
       "type":"date" 
      } 
     } 
    }, 
    "student":{ 
     "type":"object", 
     "properties":{ 
      "id":{ 
       "type":"personInfo" 
      }, 
      "pass_out_year":{ 
       "type":"date" 
      } 
     } 
    } 
} 

" तारीख "इस तरह कई स्थानों में:

{ 
    "personInfo":{ 
     "type":"object", 
     "properties":{ 
      "name":{ 
       "type":"string" 
      }, 
      "dateOfBirth":{ 
       "type":"object", 
       "properties":{ 
        "month":{ 
         "type":"integer", 
         "minimum":1, 
         "maximum":12 
        }, 
        "year":{ 
         "type":"integer", 
         "minimum":0 
        } 
       } 
      } 
     } 
    }, 
    "student":{ 
     "type":"object", 
     "properties":{ 
      "id":{ 
       "type":"personInfo" 
      }, 
      "pass_out_year":{ 
       "type":"object", 
       "properties":{ 
        "month":{ 
         "type":"integer", 
         "minimum":1, 
         "maximum":12 
        }, 
        "year":{ 
         "type":"integer", 
         "minimum":0 
        } 
       } 
      } 
     } 
    } 
} 

5,1 प्रकार in the spec के अनुसार, यह संभव नहीं है, लेकिन यह इस तरह के एक बुनियादी USECASE की तरह लगता है! क्या हो सकता है कम से कम कार्यान्वयन की सत्यापनकर्ताओं चर्चा करने के लिए

अन्य प्रकार मूल्यों, कस्टम उद्देश्यों के लिए इस्तेमाल किया जा सकता है ...

यह तो पर चला जाता है:

उत्तर

4
  1. जैसा कि आपने सही ढंग से पता लगाया है, $schema का उपयोग स्कीमा को निर्दिष्ट करने के लिए किया जा सकता है।
  2. मुझे वास्तव में JSON स्कीमा संस्करण के लिए googling के दौरान यह विषय मिला, और संस्करण के लिए यूआरआई का उपयोग लॉजिकल लगता है।
  3. आप $ref का उपयोग कर सकते हैं ताकि किसी अन्य स्कीमा को लिंक किया जा सके।
  4. फिर से, आप $ref और JSON Pointer का उपयोग अन्य स्कीमा से परिभाषाओं को आयात करने के लिए कर सकते हैं।

आप validating द्वारा अपनी स्कीमा को हमेशा जांच सकते हैं कि आपने कोई गलती की है या नहीं।

1

कल्पना आप सुझाव देने के लिए कर सकता है लगता है कर।

मेरे दिमाग में, आप जो करना चाहते हैं वह ठीक लगता है। यह टाइप स्कीम रखने और उसी फ़ाइल में परिभाषा टाइप करने के लिए आपकी स्कीमा की स्पष्टता में मदद कर सकता है।

मुझे लगता है कि आपकी फ़ाइल में क्यू को जेसन के बाहर संभाला जाना चाहिए, उदा। एक देव कदम है जो एक पूर्ण स्क्रिप्ट/टेम्पलेट (उदाहरण के लिए erb या कुछ ऐसे) से पूर्ण जेसन उत्पन्न करता है जो आपके सबफ़ाइल विलय कर रहा है। मेरे दिमाग में आपकी सेवा हमेशा उस सेवा के साथ पूरी तरह से बातचीत करने के लिए आवश्यक पूर्ण जेसन प्रदान करनी चाहिए। यदि यह ग्राहकों के परिप्रेक्ष्य से अप्रबंधनीय हो जाता है, तो यह एक और सेवा पेश करने के लिए एक संकेत हो सकता है।

+0

बहुत ज्यादा काम की तरह लगता है, इसलिए मैं यह काम नहीं चलेगा। लेकिन हां, एक व्यवहार्य विकल्प, विशेष रूप से आज के तकनीक-एनवी में मुझे यकीन है कि यह किसी भी भाषा/env में ऐसा करने के लिए टूल ढूंढना है। धन्यवाद। – Kashyap

+0

JSON स्कीमा के v4 में ऐसा अब और अनुमति नहीं है: http://json-schema.org/latest/json-schema-validation.html#anchor79 – Mitar

2

#5.23 in JSON Schema Draft 03 के अनुसार आप "format" : "date" का उपयोग क्यों नहीं करते हैं?

प्लस जन्म तिथि की आपकी परिभाषा में ऐसी तारीख नहीं है जो एक त्रुटि प्रतीत होती है।

+0

धन्यवाद। सवाल यह समझने के लिए और अधिक था कि कैसे 'तिथि' को परिभाषित करने के बजाय कस्टम structs को परिभाषित किया जाए, जो केवल एक उदाहरण के रूप में था। – Kashyap

+0

@artemoboturov # 5.23 का लिंक JSON स्कीमा ड्राफ्ट 3 के लिए मान्य है, लेकिन नवीनतम "स्थिर ड्राफ्ट" 04 में यह मौजूद नहीं है। [अनुभाग 7.3.1 में जेएसओएन स्कीमा सत्यापन दस्तावेज] (http://json-schema.org/latest/json-schema-validation.html#anchor108) मूल्य "दिनांक-समय" के साथ "प्रारूप" घोषित करता है। दुर्भाग्य से कोई "तारीख" नहीं है। –

3

इस लेखन, JSON स्कीमा विनिर्देश के वर्तमान संस्करण के समय मसौदा-v4, जिसमें string उदाहरण के लिए प्रारूप date-timeclearly specified है और व्यवहार में बहुत उपयोगी है।

कोई सरल प्रारूप date अब तक परिभाषित नहीं है, लेकिन आप आसानी से टाइप string के रूप में अपने वस्तु की संपत्ति परिभाषित कर सकते हैं और फिर यह की चोटी पर एक formatpattern validation (ECMA 262 regex बोली) लागू होते हैं।

उदाहरण के लिए:

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "title": "Example Schema" 
    "description": "This schema contains only a birth date property" 
    "type": "object", 
    "required": ["birth_date"], 
    "properties": { 
     "birth_date": { 
      "type": "string", 
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" 
     } 
    } 
} 
+0

लेकिन अगर उसके पास जन्म_डेट और मृत्यु_डेट और join_date और last_modified_date और आदि है ... तो फिर, हर जगह पैटर्न को डुप्लिकेट करें? –