2011-01-13 10 views
22

schema에 대해 JSON의 유효성을 검사 할 수있는 안정적인 라이브러리가 있습니까?JSON 스키마 유효성 검사

json-schema.orglist of implementations을 제공합니다. 특히 C 및 C++가 누락되었습니다.

C++ JSON 스키마 검사기를 쉽게 찾을 수없는 이유가 있습니까?
들어오는 JSON 파일의 유효성을 검사하는 빠른 방법이 필요합니까?

+3

대부분의 경우 C 및 C++가 거의 웹 어플리케이션에 사용되지 않기 때문에, JSON의 주된 응용 프로그램입니다. 어떤 것이 없으면 다른 것을 가져 와서 이식 할 수 있습니다. –

+3

JSON은 브라우저와 웹 서버 간의 대화 이상의 용도로 사용할 수 있습니다. 환경 설정, 시스템 간의 RPC 등을 저장하는 데 사용할 수 있습니다. 기본적으로, xml은 오늘날 어디에서나 (잘못) 사용됩니다. –

+2

@Mark : 실제로 이것은 우리의 정확한 사용 사례입니다. 복잡한 구성을 저장하는 방법이 필요합니다 (ini에는 너무 복잡합니다). JSON을 xml로 선택했습니다. –

답변

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
  • 당신은 또한 당신의 응용 프로그램에 파이썬이나 자바 스크립트 인터프리터를 연결 수를하고, 이미 찾은 유효성 검사기 구현의 기본 버전을 실행하기 만하면됩니다.

    왜 C++ JSON 스키마 검사기를 쉽게 찾을 수 없나요?

    JSON이 웹 기술로 시작된 것으로 알고 있으며 C/C++가 웹 응용 프로그램 구현에 유리하지 않았습니다.

    +6

    +1 ... "부끄러워서 ..." –

    +1

    Chromium 유효성 검사기가 실제로 보입니다. 좋지만 크롬을 사용하기 전에 기본 코드에서 스키마를 추출하고 싶습니다. 솔루션에서의 하락이 아니라 직접 작성하는 것보다 훨씬 낫습니다. –

    +0

    [JSON Schema site] (http://json-schema.org/implementations.html)에는 C 라이브러리 (WJElement)가 나열되어 있지만 그와 관련된 경험이 없으며, 최신 버전의 표준을 지원합니다. – cloudfeet

    2

    UniversalContainer (libuc)를 사용해 볼 수 있습니다. http://www.greatpanic.com/code.html. 이 라이브러리의 컨테이너 계약/스키마 검사 클래스를 찾고 있습니다. 스키마 형식은 너무 복잡하지만 관심있는 모든 것을 처리하고 특정 인스턴스가 스키마를 충족하지 못하는 이유에 대한 합리적인보고를 제공해야합니다.

    2

    Valijson은 부스트에만 의존하는 매우 훌륭한 라이브러리입니다 (그리고 나는 실제로 change을 기대하고 있습니다). JsonCpp, rapidjson 및 json11과 같이 가장 일반적으로 사용되는 라이브러리에 대한 어댑터를 제공하는 특정 JSON 파서에 의존하지도 않습니다.

    코드는 자세한 보일지도 모르지만, 당신은 항상 도우미 (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()); 
        } 
    }