2011-01-13 10 views
22

क्या कोई स्थिर लाइब्रेरी है जो JSON को schema के विरुद्ध मान्य कर सकती है?JSON स्कीमा सत्यापन

json-schema.orglist of implementations प्रदान करता है। विशेष रूप से सी और सी ++ गायब हैं।

क्या कोई कारण है कि मैं आसानी से सी ++ JSON स्कीमा सत्यापनकर्ता नहीं ढूंढ सकता?
क्या कोई और आने वाली JSON फ़ाइलों को सत्यापित करने का त्वरित तरीका नहीं चाहता है?

+3

सबसे अधिक संभावना है क्योंकि C और C++ शायद ही कभी webapps के लिए उपयोग किया जाता है, जो JSON के प्रमुख अनुप्रयोग है। यदि कोई नहीं है, तो आप एक और ले सकते हैं और इसे बंद कर सकते हैं। –

+3

जेएसओएन (है?) ब्राउज़र और वेबसर्वर के बीच बात करने से कहीं ज्यादा उपयोग कर सकता है। आप इसे वरीयताओं को संग्रहित करना, सिस्टम के बीच आरपीसी आदि का उपयोग करना चाह सकते हैं। असल में, कहीं भी एक्सएमएल (गलत) उपयोग किया जाता है। –

+2

@ मार्क: वास्तव में यह हमारा सटीक उपयोग केस है। हमें जटिल विन्यास (आईएनआई के लिए बहुत जटिल) स्टोर करने का एक तरीका चाहिए। हमने जेएसओएन को एक्सएमएल के रूप में चुना है। –

उत्तर

18

क्या कोई स्थिर लाइब्रेरी है जो JSON को स्कीमा के विरुद्ध मान्य कर सकती है?

  • क्रोमियम परियोजना से::

मैं गूगल पर एक जोड़ी हिट पाया http://aaronboodman-com-v1.blogspot.com/2010/11/c-version-of-json-schema.html

  • http://avro.apache.org/docs/1.4.1/api/cpp/html/index.html
  • तुम भी अपने एप्लिकेशन में एक अजगर या जावास्क्रिप्ट दुभाषिया प्लग सकता है, और बस उन वैधकर्ता कार्यान्वयन के मूल संस्करण को चलाएं जिन्हें आप पहले ही पा चुके हैं।

    क्या कोई कारण है कि मैं आसानी से सी ++ JSON स्कीमा सत्यापनकर्ता नहीं ढूंढ सकता?

    मेरा मानना ​​है कि जेएसओएन एक वेब तकनीक के रूप में उभरा है, और सी/सी ++ वेब ऐप कार्यान्वयन के पक्ष में छूट से बाहर हो गया है।

    +6

    +1 "... पक्ष से बाहर गिर गया ..." –

    +1

    क्रोमियम सत्यापनकर्ता वास्तव में दिखता है अच्छा है लेकिन मैं इसका इस्तेमाल करने से पहले क्रोमियम के बेस कोड से स्कीमा निकालना चाहता हूं। तो यह समाधान में गिरावट नहीं है बल्कि खुद को लिखने से काफी बेहतर है। –

    +0

    [जेएसओएन स्कीमा साइट] (http://json-schema.org/implementations.html) एक सी लाइब्रेरी (WJElement) सूचीबद्ध करता है, लेकिन मेरे पास इसका कोई अनुभव नहीं है, और मुझे पूरा यकीन है कि यह ' मानक के नवीनतम संस्करण का समर्थन नहीं करते हैं। – cloudfeet

    2

    आप UniversalContainer (libuc) को आजमा सकते हैं। http://www.greatpanic.com/code.html। आप इस पुस्तकालय में कंटेनर अनुबंध/स्कीमा चेकिंग क्लास की तलाश में हैं। स्कीमा प्रारूप गुंजाइश है, लेकिन आपको जो कुछ भी पसंद है उसे संभालना चाहिए और उचित रिपोर्टिंग प्रदान करना चाहिए कि क्यों एक विशेष उदाहरण स्कीमा को पूरा करने में विफल रहता है।

    2

    Valijson एक बहुत अच्छी लाइब्रेरी है जो केवल बूस्ट पर निर्भर करती है (और मैं वास्तव में change की उम्मीद कर रहा हूं)। यह किसी भी विशेष JSON पार्सर पर भी निर्भर नहीं है, जो जेसनसीपीपी, रैपिजसन और जेसन 11 जैसी सबसे आम तौर पर उपयोग की जाने वाली पुस्तकालयों के लिए एडाप्टर प्रदान करता है।

    कोड वर्बोज़ लग सकता है, लेकिन आप हमेशा एक सहायक (JsonCpp के लिए उदाहरण) लिख सकते हैं:

    #include <json-cpp/json.h> 
    #include <sstream> 
    #include <valijson/adapters/jsoncpp_adapter.hpp> 
    #include <valijson/schema.hpp> 
    #include <valijson/schema_parser.hpp> 
    #include <valijson/validation_results.hpp> 
    #include <valijson/validator.hpp> 
    
    void validate_json(Json::Value const& root, std::string const& schema_str) 
    { 
        using valijson::Schema; 
        using valijson::SchemaParser; 
        using valijson::Validator; 
        using valijson::ValidationResults; 
        using valijson::adapters::JsonCppAdapter; 
    
        Json::Value schema_js; 
        { 
        Json::Reader reader; 
        std::stringstream schema_stream(schema_str); 
        if (!reader.parse(schema_stream, schema_js, false)) 
         throw std::runtime_error("Unable to parse the embedded schema: " 
               + reader.getFormatedErrorMessages()); 
        } 
    
        JsonCppAdapter doc(root); 
        JsonCppAdapter schema_doc(schema_js); 
    
        SchemaParser parser(SchemaParser::kDraft4); 
        Schema schema; 
        parser.populateSchema(schema_doc, schema); 
        Validator validator(schema); 
        validator.setStrict(false); 
        ValidationResults results; 
        if (!validator.validate(doc, &results)) 
        { 
        std::stringstream err_oss; 
        err_oss << "Validation failed." << std::endl; 
        ValidationResults::Error error; 
        int error_num = 1; 
        while (results.popError(error)) 
        { 
         std::string context; 
         std::vector<std::string>::iterator itr = error.context.begin(); 
         for (; itr != error.context.end(); itr++) 
         context += *itr; 
    
         err_oss << "Error #" << error_num << std::endl 
           << " context: " << context << std::endl 
           << " desc: " << error.description << std::endl; 
         ++error_num; 
        } 
        throw std::runtime_error(err_oss.str()); 
        } 
    } 
    
    संबंधित मुद्दे