web-dev-qa-db-ja.com

JSONスキーマ検証

スキーマ に対してJSONを検証できる安定したライブラリはありますか?

json-schema.org実装のリスト を提供します。特に、CとC++が欠落しています。

C++ JSONスキーマバリデーターを簡単に見つけることができない理由はありますか?
受信したJSONファイルをすばやく検証する方法を他の誰かが望んでいませんか?

26
deft_code

スキーマに対してJSONを検証できる安定したライブラリはありますか?

私はグーグルでいくつかのヒットを見つけました:

PythonまたはJavascriptインタープリターをアプリにプラグインして、既に見つかったバリデーター実装のネイティブバージョンを実行することもできます。

C++ JSONスキーマバリデーターを簡単に見つけることができない理由はありますか?

JSONはWebテクノロジーとして生まれたものであり、C/C++はWebアプリの実装に不利になっていると思います。

18

Valijson は、Boostのみに依存する非常に優れたライブラリです(そして、私は実際に change thatを望んでいます)。特定の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());
  }
}
3
ansgri

UniversalContainer(libuc)を試すことができます。 http://www.greatpanic.com/code.html 。このライブラリでコンテナコントラクト/スキーマチェッククラスを探しています。スキーマ形式は不格好ですが、気になるすべてを処理し、特定のインスタンスがスキーマを満たさない理由に関する合理的なレポートを提供する必要があります。

2
user693653

スキーマに対してJSONを検証できる安定したライブラリはありますか?

ラピジソン

私はそれをスキーマに対するJSON検証に使用しています(ほとんどの場合)。テスト済みで安定しているようです(githubリポジトリによると、v1.1.0は最新リリースのようです)。

0
bitfox

多言語アプローチに対応できる場合、Ajvは堅実なJavaScript実装のように見えます。

https://ajv.js.org/

注:ajv-cliもあります

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

0