【问题标题】:How to fix JsonCPP error from getMemberNames()?如何从 getMemberNames() 修复 JsonCPP 错误?
【发布时间】:2012-07-11 17:43:03
【问题描述】:

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 是一个数组值,我通过获取它来确认它是ValueType = 6

【问题讨论】:

    标签: c++ json jsoncpp


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2016-11-17
    • 2011-07-24
    • 2021-05-10
    • 2017-07-17
    相关资源
    最近更新 更多