2012-07-12 14 views
5

Die JSON-Datei wie folgt aussieht:Wie zu beheben JsonCPP Fehler von getMemberNames()?

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

Die C++ Datei wie folgt aussieht:

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(); 

Der Fehler, verursacht durch "strings.getMemberNames()" ist:

Assertion failed: (type_ == nullValue || type_ == objectValue), function getMemberNames, file /projects/.../jsoncpp.cpp, 

strings ist ein ArrayValue, ich habe es bestätigt, indem ich es ValueType = 6 bekommen habe.

Antwort

5

Wie Sie sagen, ist Strings ein Array, kein Objekt. Sie müssen entweder: (i) Ihre Zeichenketten json in ein Objekt konvertieren.

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

In diesem Fall wird Ihr bestehender Code in Ordnung sein. Das würde ich tun, wenn Sie die Kontrolle über den JSON haben, den Sie analysieren.

oder (ii) eine Iteration über das Array Strings - ich dies nur tun würde, wenn die json von einigen thrid Partei angegeben ist - es ist etwas wie folgt aussehen:

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()); 
} 

tatsächlich die Werte mit jedoch in all_keys, um später auf irgendwas im Zeichenfolgen-Array zuzugreifen, wird sehr schmerzhaft sein - deshalb sollten Sie die Schlüssel-Wert-Paare in einer Map speichern.

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

Oder zumindest den Index des Strings-Arrays speichern, in dem der Schlüssel gefunden wurde.

+0

Ihre erste Antwort war meine ideale Lösung, aber ich konnte nicht herausfinden, wie ich meinen PHP Code modifizieren kann, um dieses Format zu haben. Ich habe diese Frage hier gepostet, in der Zwischenzeit werde ich es versuchen Lösungen :) http://stackoverflow.com/questions/11444171/php-to-json-format –