如何修复getMemberNames()中的JsonCPP错误

How to fix JsonCPP error from getMemberNames()?

本文关键字:中的 JsonCPP 错误 何修复 getMemberNames      更新时间:2023-10-16

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来确认它。

正如您所说,字符串是一个数组,而不是对象。您需要:(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] ) );
}