The JSON file looks like this:
{
"strings": [
    {
        "key_one": "value_one!"
    },
    {
        "key_two": "value_two!"
    },
    ]
}
The C++ file looks like this:
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();
The error caused by "strings.getMemberNames()" is:
Assertion failed: (type_ == nullValue || type_ == objectValue), function getMemberNames, file /projects/.../jsoncpp.cpp,
strings is an arrayValue, I confirmed it by getting it's ValueType = 6.
As you say, strings is an array, not an object. You need to either : (i) convert your strings json to be an object.
{
"strings": {
        "key_one": "value_one!",
        "key_two": "value_two!"
    }
}
In which case your existing code will be fine. This is what I'd do if you have control over the json you're parsing.
or (ii) Iterate over the strings array - I'd only do this if the json is specified by some thrid party - It will look something like this:
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() );
}
However actually using the values in all_keys to access anything in the strings array later is going to be painful - so you might want to store the key-value pairs in a map.
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]] = ...
}
Or at least store the index of the strings array where the key was found.
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] ) );
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With