2012-07-12 37 views
5

Plik JSON wygląda następująco:Jak naprawić błąd JsonCPP z getMemberNames()?

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

plik C++ wygląda następująco:

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

Błąd spowodowany przez "strings.getMemberNames()" jest:

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

strings jest wartością tablicy, potwierdziłem ją, pobierając numer ValueType = 6.

Odpowiedz

5

Tak jak mówisz, łańcuchy to tablica, a nie obiekt. Musisz: (i) przekonwertować json strun jako obiekt.

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

W takim przypadku istniejący kod będzie w porządku. To właśnie bym zrobił, gdybyś miał kontrolę nad jsonem, który parsujesz.

lub (ii) iteracyjne nad tablicy ciągów - Chciałbym to zrobić tylko wtedy, gdy json jest określona przez jakiś Thrid imprezę - będzie to wyglądać mniej więcej tak:

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

jednak rzeczywiście przy wartości w all_keys, aby uzyskać dostęp do wszystkiego w tablicy łańcuchów później, będzie bolesne - możesz chcieć przechowywać pary klucz-wartość na mapie.

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

Lub przynajmniej przechowywać indeks tablicy ciągów, w której znaleziono klucz.

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

Twoja pierwsza odpowiedź była moim idealnym rozwiązaniem, ale nie mogłem się dowiedzieć, jak zmodyfikować mój kod PHP, aby mieć ten format, opublikowałem to pytanie tutaj, w międzyczasie, wypróbuję inne rozwiązania :) http://stackoverflow.com/questions/11444171/php-to-json-format –

Powiązane problemy