2012-07-12 17 views
5

Il file JSON è simile al seguente:Come correggere l'errore JsonCPP da getMemberNames()?

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

Il file C++ è simile al seguente:

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

L'errore causato da "strings.getMemberNames()" è:

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

strings è un arrayValue, l'ho confermato ottenendo il numero ValueType = 6.

risposta

5

Come dici tu, le stringhe sono un array, non un oggetto. È necessario: (i) convertire le stringhe json in oggetto.

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

In tal caso, il codice esistente andrà bene. Questo è quello che farei se tu avessi il controllo sul json che stai analizzando.

o (ii) iterare l'array stringhe - mi piacerebbe farlo solo se il JSON è specificato da qualche partito thrid - Si sarà simile a questo:

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

Ma in realtà utilizzando i valori in all_keys per accedere a qualsiasi cosa nell'array di stringhe in seguito sarà doloroso, quindi potresti voler memorizzare le coppie chiave-valore in una mappa.

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

O almeno memorizzare l'indice dell'array di stringhe in cui è stata trovata la chiave.

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

la tua prima risposta era la mia soluzione ideale, ma non riuscivo a scoprire come modificare il mio codice PHP per avere quel formato, ho postato quella domanda qui, nel frattempo, proverò il tuo altro soluzioni :) http://stackoverflow.com/questions/11444171/php-to-json-format –

Problemi correlati