2017-07-11 18 views
1

私はjsoncppをubuntu 14.04で使用しています。 apt-get libjsoncpp-dev libjsoncpp0と一緒にインストールされます。私はそれがjsoncppのどのバージョンか分からない。この場合、jsoncppをスローする方法は?

私はキー名に(C++で)タイプミスがあり、それを追跡するのは本当に面倒でした。この例を考えてみましょう:

#include <iostream> 
#include <jsoncpp/json/json.h> 

int main(int argc, char** argv) { 
    Json::Reader reader(Json::Features::strictMode()); 
    Json::Value obj; 

    std::string json = "{\"mykey\" : 42}"; 

    if (!reader.parse(json.c_str(), obj)) { 
    std::cout << "JSON parse error" << std::endl; 
    } 
    const Json::Value& mykey1 = obj["mykey"]; 
    std::cout << "mykey1:" << mykey1.asInt() << std::endl; 

    const Json::Value& mykey2 = obj["mykey_typo"]; 
    std::cout << "mykey2:" << mykey2.asInt() << std::endl; 
    return 0; 
} 

私は取得しています。この出力:

mykey1:42 
mykey2:0 

存在しないキーへのアクセスは0の値は、私には怖いです作り出すという事実。これは、タイプミスがあった場合、正しい値の代わりにゼロを使用することを意味します。私はむしろタイプミスがあることを知りたいと思う。 jsoncppをスローする方法や、ここで推奨されるアプローチは何ですか?

isMemberを呼び出してルックアップを行うヘルパーを書くことはできますが、ライブラリ自体に解決策があるかどうかは不思議でした。

答えて

2

設計上、jsoncppの動作がasIntの場合、値がnullの場合は0が返されます。おそらく値を使う前にヌルチェックをしますか?

sourceの721行目をご覧ください。

+0

私が驚いたことは、jsoncppが解析エラーを引き起こすことです。しかし、それは "アクセスエラー"を投げることはありません。ヌルオブジェクトからでも存在しないキーを要求することができ、エラーはありません。 nullは0の数値を返し、エラーは返されません。私が推測する解決策はisNullとisMemberを明示的に使うことです。 – Philip

+0

これは、jsoncpp devsが[std :: map](http://www.cplusplus.com/reference/map/map/operator [] /)の動作をエミュレートしようとする試みであると思われます。 しかし、JsonValueオブジェクトの存在しないキーにアクセスするとサイズが大きくなるかどうかはわかりません。 – architrex

+0

ええ、私はスローするラッパーオブジェクトを作成するように誘惑されますが、私は上流に泳いでいて、何もスローしないというライブラリのアプローチを受け入れるべきかどうか疑問に思っています。いずれにせよ、これはエラーではありません:root ["bogus1"] ["bogus2"] ["bogus3"]。asInt()はただ0を返します。 – Philip

関連する問題