JSON模式验证

时间:2011-01-13 02:19:00

标签: c++ c json jsonschema

是否存在可以针对schema验证JSON的稳定库?

json-schema.org提供list of implementations。值得注意的是C和C ++缺失。

有没有理由我不能轻易找到C ++ JSON模式验证器? 没有其他人想要快速验证传入的JSON文件吗?

5 个答案:

答案 0 :(得分:18)

  

是否有可以根据模式验证JSON的稳定库?

我在谷歌上发现了几个点击:

您还可以将Python或Javascript解释器插入您的应用程序,并只运行您已经找到的那些验证器实现的本机版本。

  

有没有理由我不能轻易找到C ++ JSON模式验证器?

我认为JSON起源于网络技术,而C / C ++已经不再支持Web应用程序了。

答案 1 :(得分:3)

Valijson是一个非常好的图书馆,它只依赖于Boost(而我实际上希望change那个)。它甚至不依赖于任何特定的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 :(得分:2)

您可以尝试使用UniversalContainer(libuc)。 http://www.greatpanic.com/code.html。您正在寻找此库中的容器合同/模式检查类。模式格式很笨重,但应该处理您关心的所有内容,并提供合理的报告,说明特定实例无法满足模式的原因。

答案 3 :(得分:0)

如果您可以采用多语言方法,则Ajv似乎是可靠的JavaScript实现。

https://ajv.js.org/

注意:还有一个ajv-cli

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

答案 4 :(得分:0)

是否有一个稳定的库可以根据模式验证JSON?

Rapidjson

我将其用于针对某个模式的JSON验证(最多)。它似乎已经过测试且稳定(根据github repo的说法,v1.1.0似乎是最新版本)。