2011-01-13 17 views
22

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

json-schema.orgは、list of implementationsを提供する。特にCとC++が欠けている。

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

+3

ほとんどのCおよびC++がめったにWebアプリケーションに使用されていないので、JSONの主要なアプリケーションです。何もない場合、別のものを持ってそれを移植することができます。 –

+3

JSONは、ブラウザとWebサーバーの間で話す以外にも使用できます。環境設定、システム間のRPCなどを保存しておきたいかもしれません。基本的に、現在xmlはどこでも使用されています。 –

+2

@マーク:実際これは私たちの正確な使用例です。複雑な設定(iniでは複雑すぎる)を格納する方法が必要です。 JSONをxmlとして選択しました。 –

答えて

18

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

私はカップルがGoogleでヒットが見つかりました:クロムプロジェクトから

あなたはまた、あなたのアプリケーションへのPythonやJavaScriptインタープリタを差し込むことができ、かつ既に見つかったバリデータ実装のネイティブバージョンを実行するだけです。

なぜ私は簡単にC++ JSONスキーマバリデーターを見つけることができないのですか?

私はJSONがウェブ技術として発祥し、C/C++がウェブアプリケーションの実装に有利でないと思う。

+6

+1 ... "迷惑..." –

+1

クロムバリデーターは本当に見えます良いですが、私はそれを使用する前にクロムのベースコードからスキーマを抽出したいと思います。だから、それは解決策の低下ではなく、自分自身を書くことよりもはるかに良いです。 –

+0

[JSON Schema site](http://json-schema.org/implementations.html)はCライブラリ(WJElement)をリストしていますが、私はそれに関する経験はありません。最新バージョンの標準をサポートしています。 – cloudfeet

2

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

2

Valijsonは、Boostにのみ依存する非常に優れたライブラリです(そして、私は実際にchangeにそれを望んでいます)。 JsonCpp、rapidjson、json11のような最も一般的に使用されるライブラリ用のアダプタを提供する特定のJSONパーサにも依存しません。

コードが冗長に見えるかもしれませんが、あなたは常にヘルパー(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()); 
    } 
} 
関連する問題