Walidacja schematu JSON

Czy istnieje stabilna biblioteka, która może walidować JSON według schematu ?

Json-schema.org dostarcza listę implementacji . W szczególności brakuje C i C++.

Czy Jest jakiś powód, dla którego nie mogę łatwo znaleźć walidatora schematu C++ JSON?
Czy ktoś jeszcze nie chce szybkiego sposobu walidacji przychodzących plików JSON?

Author: deft_code, 2011-01-13

3 answers

Czy istnieje stabilna biblioteka, która może walidować JSON według schematu?

Znalazłem kilka trafień w google:

Możesz również podłączyć interpreter Pythona lub Javascript do aplikacji i po prostu uruchomić natywną wersję tych walidatorów wdrożenia, które już znalazłeś.

Czy Jest jakiś powód, dla którego nie mogę łatwo znaleźć walidatora schematu C++ JSON?

[1]} uważam, że JSON powstał jako technologia internetowa, A C / C++ wypadł z faworyzowania implementacji aplikacji internetowych.
 18
Author: Merlyn Morgan-Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-04 15:04:16

Valijson jest bardzo dobrą biblioteką, która zależy tylko od Boost (i mam nadzieję, że to zmieni). Nie zależy nawet od żadnego konkretnego parsera JSON, zapewniając adaptery do najczęściej używanych bibliotek, takich jak JsonCpp, rapidjson i json11.

Kod może wydawać się gadatliwy, ale zawsze możesz napisać helper (przykład dla 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());
  }
}
 3
Author: ansgri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-30 11:37:00

Możesz spróbować UniversalContainer (libuc). http://www.greatpanic.com/code.html. szukasz klasy container contract / schema checking w tej bibliotece. Format schematu jest niezgrabny, ale powinien obsługiwać wszystko, na czym Ci zależy i zapewniać rozsądne raportowanie, dlaczego dana instancja nie spełnia schematu.

 2
Author: user693653,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-31 18:43:54