2011-01-13 2 views
22

Есть ли стабильная библиотека, которая может проверять JSON на schema?Проверка схемы JSON

json-schema.org содержит list of implementations. Примечательно, что C и C++ отсутствуют.

Есть ли причина, по которой я не могу легко найти средство проверки схемы C++ JSON?
Не хочет ли кто-нибудь быстрый способ проверки входящих файлов JSON?

+3

Скорее всего потому, что C и C++ редко используются для WebApps, который является преобладающим применением JSON. Если их нет, вы можете взять еще один и перенести его. –

+3

JSON can (is?) Используется гораздо больше, чем разговор между браузерами и веб-серверами. Возможно, вы захотите использовать его, сохраняя предпочтения, RPC между системами и т. Д. В принципе, где-то xml используется (используется) сегодня. –

+2

@Mark: действительно, это наш конкретный прецедент. Нам нужен способ хранения сложной конфигурации (слишком сложной для ini). Мы выбрали JSON как над xml. –

ответ

18

Есть ли стабильная библиотека, которая может проверять JSON на схему?

Я нашел пару хитов на Google:

Вы также можете подключить интерпретатор Python или Javascript в вашем приложении, и просто запустите собственную версию тех реализаций, которые вы уже нашли.

Есть ли причина, по которой я не могу легко найти валидатор схемы C++ JSON?

Я считаю, что JSON возникла как веб-технология, а C/C++ не понравилась для реализации веб-приложений.

+6

+1 для «... упал в немилости ...» –

+1

Валидатор Chromium выглядит действительно хорошо, но я хотел бы извлечь схему из базового кода хром перед ее использованием. Так что это не капля в решении, а гораздо лучше, чем писать. –

+0

[JSON Schema site] (http://json-schema.org/implementations.html) содержит библиотеку C (WJElement), но у меня нет опыта с этим, и я уверен, t поддерживает последнюю версию стандарта. – cloudfeet

2

Вы можете попробовать UniversalContainer (libuc). http://www.greatpanic.com/code.html. Вы ищете класс проверки контейнера/схемы в этой библиотеке. Формат схемы неудобен, но должен обрабатывать все, что вам нужно, и предоставлять разумные отчеты о том, почему конкретный экземпляр не отвечает схеме.

2

Valijson - очень хорошая библиотека, которая зависит только от Boost (и я на самом деле надеюсь change что). Он даже не зависит от какого-либо конкретного анализатора JSON, предоставляя адаптеры для наиболее часто используемых библиотек, таких как JsonCpp, quickjson и json11.

код может показаться многословным, но вы всегда можете написать помощник (пример для 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()); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^