6

JSONファイルは次のようになります。

{
"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,

stringsはarrayValueであり、それを取得して確認しましたValueType = 6

4

1 に答える 1

5

あなたが言うように、文字列は配列であり、オブジェクトではありません。次のいずれかを行う必要があります。(i)文字列jsonをオブジェクトに変換します。

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

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

または(ii)文字列配列を反復処理します-jsonがサードパーティによって指定されている場合にのみこれを行います-次のようになります:

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]] = ...
}

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

std::vector<std::pair<int,std::string> > all_keys;    std::vector<std::string> all_keys;
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 )
      all_keys.push_back( std::make_pair(index, cur_keys[j] ) );
}
于 2012-07-12T02:09:53.870 に答える