Valijson ist eine sehr gute Bibliothek, die nur von Boost abhängt (Und ich hoffe eigentlich auf change dass). Es hängt nicht einmal von einem bestimmten JSON-Parser ab, der Adapter für die am häufigsten verwendeten Bibliotheken wie JsonCpp, Rapidjson und Json11 bereitstellt.
Der Code kann die ausführliche erscheinen, aber man kann immer einen Helfer (Beispiel für JsonCpp) schreiben:
#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());
}
}
Wahrscheinlich weil C und C++ sind selten für Webapps verwendet, die die vorherrschende Anwendung von JSON ist. Wenn es keine gibt, könnten Sie eine andere nehmen und sie portieren. –
JSON kann (ist?) Für viel mehr verwendet werden, als zwischen Browsern und Webservern zu sprechen. Vielleicht möchten Sie es speichern Präferenzen, RPC zwischen Systemen, etc. Grundsätzlich überall wo xml heute verwendet wird. –
@Mark: Das ist tatsächlich unser genauer Anwendungsfall. Wir brauchen eine Möglichkeit, komplexe Konfigurationen zu speichern (zu komplex für ini). Wir haben JSON als über XML ausgewählt. –