Проверка схемы JSON - PullRequest
       10

Проверка схемы JSON

26 голосов
/ 13 января 2011

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

json-schema.org предоставляет список реализаций ,В частности, отсутствуют C и C ++.

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

Ответы [ 4 ]

18 голосов
/ 13 января 2011

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

Я нашел пару просмотров в Google:

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

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

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

3 голосов
/ 30 января 2016

Valijson - очень хорошая библиотека, которая зависит только от Boost (и я на самом деле надеюсь изменить это). Он даже не зависит от какого-либо конкретного анализатора JSON, предоставляя адаптеры для наиболее часто используемых библиотек, таких как JsonCpp, rapidjson и 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());
  }
}
2 голосов
/ 31 декабря 2012

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

0 голосов
/ 21 апреля 2019

Если вы можете использовать полиглотный подход, Ajv представляется надежной реализацией JavaScript.

https://ajv.js.org/

Примечание: также имеется ajv-cli

https://github.com/jessedc/ajv-cli

...