2012-07-12 3 views
5

JSONファイルは次のようになります。getMemberNames()からJsonCPPエラーを修正するには?

{ 
"strings": [ 
    { 
     "key_one": "value_one!" 
    }, 
    { 
     "key_two": "value_two!" 
    }, 
    ] 
} 

C++ファイルには、次のようになります。

Json::Value root; 
Json::Reader reader; 
bool parsingSuccessful = reader.parse(contents, root); 
const Json::Value strings = root["strings"]; 
std::vector<std::string> list = strings.getMemberNames(); 

による誤差 "strings.getMemberNames()" である:

Assertion failed: (type_ == nullValue || type_ == objectValue), function getMemberNames, file /projects/.../jsoncpp.cpp, 

がarrayValueなので、ValueType = 6ということで確認しました。

答えて

5

文字どおり、文字列はオブジェクトではなく配列です。あなたはどちらかをする必要があります:(i)あなたの文字列jsonをオブジェクトに変換します。

{ 
"strings": { 
     "key_one": "value_one!", 
     "key_two": "value_two!" 
    } 
} 

この場合、既存のコードは問題ありません。これは、あなたが解析しているjsonを制御できるなら、私がやることです。

または(ⅱ)反復は、文字列配列の上に - JSONは、いくつかのthridパーティによって指定された場合、私はこれだけにしてください - それは、このようなものになります。しかし、実際の値でを使用して

std::vector<std::string> all_keys; 
for (int index = 0; index < strings.size(); ++index) { 
    std::vector<std::string> cur_keys = strings[index].getMemberNames(); 
    all_keys.insert(all_keys.end(), cur_keys.begin(), cur_keys.end()); 
} 

を後で文字列配列内のすべてのものにアクセスするall_keysは苦痛になります。そのため、キーと値のペアをマップに格納するとよいでしょう。

std::map<std::string,std::string> key_values; 
for (int index = 0; index < strings.size(); ++index) { 
    std::vector<std::string> cur_keys = strings[index].getMemberNames(); 
    for(int j=0; j<cur_keys.size(); ++j) 
     key_values[cur_keys[j]] = ... 
} 

少なくとも、キーが見つかった場所の文字列配列のインデックスを格納します。

+0

あなたの最初の答えは私の理想的な解決策でしたが、私のPHPコードをその形式に変更する方法を見つけることができませんでしたが、その間に質問を投稿しました。ソリューション:) http://stackoverflow.com/questions/11444171/php-to-json-format –

関連する問題