2012-07-12 377 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, 

strings是一个arrayValue,我通过获取它的ValueType = 6来确认它。

回答

5

正如你所说,字符串是一个数组,而不是一个对象。你需要:(i)将你的字符串json转换成一个对象。

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

在这种情况下,您现有的代码将会很好。如果你能控制你正在解析的json,这就是我所要做的。

或(ii)遍历字符串数组 - 如果被一些THRID方指定的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])); 
} 
+0

你的第一个答案是我的理想的解决方案,但我无法找出如何修改我的PHP代码有一个格式,我已经张贴这个问题在这里,在此期间,我会尝试通过另解决方案:) http://stackoverflow.com/questions/11444171/php-to-json-format – 2012-07-12 02:15:00