Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ JSON模式验证_C++_C_Json_Jsonschema - Fatal编程技术网

C++ JSON模式验证

C++ JSON模式验证,c++,c,json,jsonschema,C++,C,Json,Jsonschema,是否有一个稳定的库可以根据一个标准验证JSON 提供了一个。特别是C和C++缺失。 有没有原因我不能轻易找到C++ JSON模式验证器? 难道其他人不想快速验证传入的JSON文件吗 是否有一个稳定的库可以根据模式验证JSON 我在谷歌上找到了几个热门网站: 来自Chromium项目: 您还可以将Python或Javascript解释器插入应用程序,只需运行您已经找到的那些验证器实现的本机版本 有没有原因我不能轻易找到C++ JSON模式验证器?< /P> 我相信JSON起源于一种web技术

是否有一个稳定的库可以根据一个标准验证JSON

提供了一个。特别是C和C++缺失。

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

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

我在谷歌上找到了几个热门网站:

  • 来自Chromium项目:
您还可以将Python或Javascript解释器插入应用程序,只需运行您已经找到的那些验证器实现的本机版本

有没有原因我不能轻易找到C++ JSON模式验证器?< /P>


我相信JSON起源于一种web技术,而C/C++已经不再受web应用程序实现的青睐。

你可以试试UniversalContainer(libuc)。您正在这个库中寻找容器契约/模式检查类。模式格式很笨重,但应该处理您关心的所有事情,并提供合理的报告,说明为什么某个特定实例无法满足模式要求。

是一个非常好的库,它只依赖于Boost(我实际上希望如此)。它甚至不依赖于任何特定的JSON解析器,为最常用的库(如JsonCpp、rapidjson和json11)提供适配器

代码可能看起来很冗长,但您始终可以编写帮助程序(例如JsonCpp):

#包括
#包括
#包括
#包括
#包括
#包括
#包括
void validate_json(json::Value const&root,std::string const&schema_str)
{
使用JSON::Schema;
使用valijson::SchemaParser;
使用valijson::Validator;
使用valijson::ValidationResults;
使用valijson::adapters::JSONCPAdapter;
Json::值模式_js;
{
Json::阅读器;
std::stringstream schema\u stream(schema\u str);
if(!reader.parse(schema_stream,schema_js,false))
抛出std::runtime\u错误(“无法分析嵌入式架构:”
+reader.getFormattedErrorMessages());
}
jsoncpadapter文档(根);
jsoncpadapter schema_doc(schema_js);
SchemaParser解析器(SchemaParser::kDraft4);
图式;
populateSchema(schema_doc,schema);
验证器验证器(模式);
验证器.setStrict(假);
验证结果;
if(!validator.validate(文档和结果))
{
std::stringstream err_oss;

err_oss如果您能够适应多语言方法,Ajv似乎是一个可靠的JavaScript实现

注意:还有一个ajv cli

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


我正在使用它对一个模式进行JSON验证(最多)。它看起来是经过测试和稳定的(根据github repo,v1.1.0看起来是最新版本)

最可能是因为C和C++很少用于Web应用程序,这是JSON的主要应用程序。如果没有,那么可以使用另一个端口和端口。JSON可以(IS?)不仅仅用于浏览器和Web服务器之间的对话。您可能希望使用它来存储首选项、系统之间的RPC等。基本上,现在使用的是任何xml(mis)。@Mark:这确实是我们的使用案例。我们需要一种存储复杂配置的方法(对于ini来说太复杂了)。我们选择JSON而不是xml。现在的实现列表包括C和C++:Chromium验证器看起来非常好,但我想在使用之前从Chromium的基本代码中提取模式。因此,这不是一个简单的解决方案,但比我自己编写的解决方案要好得多。该列表列出了一个C库(WJEElement),但我对它没有任何经验,而且我很确定它不支持最新版本的标准。我同意这似乎是一个很有希望的选择,但现在还不清楚是否支持此库。既然您发布了此答案,Boost现在似乎是一个可选的依赖项:。看起来是这样的2019年8月左右,ed:@ansgri您的建议领先于时代:)
#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());
  }
}