31

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

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

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

4

6 に答える 6

18

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

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

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

C ++ JSONスキーマバリデーターが簡単に見つからない理由はありますか?

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

于 2011-01-13T03:02:32.223 に答える
7

Valijsonは、Boostのみに依存する非常に優れたライブラリです(実際、私はそれを変更したいと思っています)。特定の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());
  }
}
于 2016-01-30T11:37:00.327 に答える
2

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

于 2012-12-31T18:43:54.143 に答える
0

ポリグロットアプローチに対応できる場合、Ajvは堅実なJavaScript実装のように見えます。

https://ajv.js.org/

注:ajv-cliもあります

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

于 2019-04-21T19:47:22.023 に答える
0

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

Rapidjson

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

于 2020-03-12T17:11:37.757 に答える
0

Windowsプラットフォームでは、選択した言語に関係なく、COM/ActiveX用のJSONEssentialsを使用できます。MSVCコンパイラを使用してC++から使用する場合は、#importプリプロセッサディレクティブを使用してコンパイラで生成されたラッパーを使用できます。

そのドキュメントには、C#、VB、およびJavaScriptの最も一般的なユースケースのサンプルが多数含まれています。変更されるのは言語構文だけです。COMをサポートするほとんどすべての言語で同じライブラリ呼び出しを使用してすべてを実装できます。

また、無料のライセンスオプションを提供していることにも言及する価値があります。

スキーマを作成し、JSONEssentials評価バージョン を使用してWindowsScriptHost(WSH)用に新しく作成されたスキーマを使用してJSONドキュメントをロードおよび検証するサンプルを次に示します。

// Create a new JsonEssentials class instance.
var jess = new ActiveXObject('JsonEssentials_0.JsonEssentials.1');
jess.unlock('jesscomeval');

// Create schema JSON document object.
var schemaDoc = jess.createDocument();

// Load JSON schema.
schemaDoc.load({
    'type': 'array',
    'items': {
        'type': 'integer'
    }
});

// Create schema collection object.
var schemas = jess.createSchemas();

// Add the test schema to the collection.
var schema = schemas.add(schemaDoc, 'uri:test');

// Create JSON document object.
var instanceDoc = jess.createDocument();

// Load JSON, an array of numeric values.
instanceDoc.load([ 0, 1, 2 ]);
 
// Validate the test JSON against the added schema.
var status = schema.validate(instanceDoc);

WScript.Echo(status.success ? 'validated' : 'validation failed');

于 2022-01-25T13:08:45.280 に答える