JSON 模式验证

Posted

技术标签:

【中文标题】JSON 模式验证【英文标题】:JSON schema validation 【发布时间】:2011-06-08 06:01:20 【问题描述】:

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

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

我无法轻松找到 C++ 器有什么原因吗? 没有其他人想要一种快速验证传入 JSON 文件的方法吗?

【问题讨论】:

很可能是因为 C 和 C++ 很少用于 webapps,这是 JSON 的主要应用。如果没有,您可以再拿一个并移植它。 JSON 不仅可以(是?)用于浏览器和网络服务器之间的对话。您可能希望使用它来存储首选项、系统之间的 RPC 等。基本上,今天(错误)使用 xml 的任何地方。 @Mark:这确实是我们的确切用例。我们需要一种方法来存储复杂的配置(对于 ini 来说太复杂了)。我们选择 JSON 而不是 xml。 实现列表现在包括 C 和 C++:json-schema.org/implementations.html#validator-cpp 【参考方案1】:

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

我在 google 上找到了几个点击:

来自 Chromium 项目:http://aaronboodman-com-v1.blogspot.com/2010/11/c-version-of-json-schema.html http://avro.apache.org/docs/1.4.1/api/cpp/html/index.html

您还可以将 Python 或 javascript 解释器插入到您的应用中,然后简单地运行您已经找到的那些验证器实现的本机版本。

我找不到 C++ JSON 模式验证器有什么原因吗?

我相信 JSON 起源于一种 Web 技术,而 C/C++ 已经失宠于 Web 应用实现。

【讨论】:

Chromium 验证器看起来非常好,但我想在使用之前从 chromium 的基本代码中提取模式。所以这不是一个简单的解决方案,但比自己写一个要好得多。 JSON Schema site 列出了一个 C 库 (WJElement),但我对此没有任何经验,而且我很确定它不支持最新版本的标准。 【参考方案2】:

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());
  

【讨论】:

我同意这似乎是一个很有前途的选择,但目前还不清楚该库是否已被支持。 既然你已经发布了这个答案,看起来 Boost 现在是一个可选的依赖项:github.com/tristanpenman/valijson#dependencies。看起来这种情况在 2019 年 8 月左右发生了变化:github.com/tristanpenman/valijson/issues/63。 @ansgri 你的建议超前了 :)【参考方案3】:

你可以试试 UniversalContainer (libuc)。 http://www.greatpanic.com/code.html。您正在此库中寻找容器合同/模式检查类。架构格式很笨拙,但应该可以处理您关心的所有事情,并就特定实例不符合架构的原因提供合理的报告。

【讨论】:

【参考方案4】:

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

https://ajv.js.org/

注意:还有一个ajv-cli

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

【讨论】:

【参考方案5】:

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

Rapidjson

我将它用于针对模式的 JSON 验证(大多数情况下)。它看起来已经过测试并且很稳定(根据 github repo,v1.1.0 看起来是最新版本)。

【讨论】:

以上是关于JSON 模式验证的主要内容,如果未能解决你的问题,请参考以下文章

JSON 模式验证

java.lang.NoSuchFieldError: USE_DEFAULTS 在通过 json 模式验证器验证 json 模式时抛出

使用java的JSON模式验证[关闭]

如何在 Python 中验证 JSON Schema 模式?

pymongo 是不是支持 json 模式验证?

根据 javascript 中的模式验证 json