私は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を呼び出してルックアップを行うヘルパーを書くことはできますが、ライブラリ自体に解決策があるかどうかは不思議でした。
私が驚いたことは、jsoncppが解析エラーを引き起こすことです。しかし、それは "アクセスエラー"を投げることはありません。ヌルオブジェクトからでも存在しないキーを要求することができ、エラーはありません。 nullは0の数値を返し、エラーは返されません。私が推測する解決策はisNullとisMemberを明示的に使うことです。 – Philip
これは、jsoncpp devsが[std :: map](http://www.cplusplus.com/reference/map/map/operator [] /)の動作をエミュレートしようとする試みであると思われます。 しかし、JsonValueオブジェクトの存在しないキーにアクセスするとサイズが大きくなるかどうかはわかりません。 – architrex
ええ、私はスローするラッパーオブジェクトを作成するように誘惑されますが、私は上流に泳いでいて、何もスローしないというライブラリのアプローチを受け入れるべきかどうか疑問に思っています。いずれにせよ、これはエラーではありません:root ["bogus1"] ["bogus2"] ["bogus3"]。asInt()はただ0を返します。 – Philip