2012-07-12 14 views
5

El archivo JSON se ve así:Cómo reparar el error JsonCPP de getMemberNames()?

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

El archivo C++ es el siguiente:

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

El error causado por "strings.getMemberNames()" es:

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

strings es un arrayValue, lo confirmé obteniendo ValueType = 6.

Respuesta

5

Como usted dice, cuerdas es una matriz, no un objeto. Necesita: (i) convertir sus cadenas json en un objeto.

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

En cuyo caso su código actual estará bien. Esto es lo que haría si tienes control sobre el JSON que estás analizando.

o (ii) iterar sobre la matriz de cadenas - Yo sólo haría esto si el JSON se especifica por algún partido thrid - Se verá algo como esto:

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

Sin embargo en realidad usando los valores de all_keys para acceder a cualquier elemento en la matriz de strings más tarde va a ser doloroso, por lo que es posible que desee almacenar los pares clave-valor en un mapa.

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 al menos almacenar el índice de la matriz de cadenas donde se encontró la clave.

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

su primera respuesta fue mi solución ideal, pero no pude encontrar la manera de modificar mi código PHP para tener ese formato, he publicado esa pregunta aquí, mientras tanto, voy a probar su otro soluciones :) http://stackoverflow.com/questions/11444171/php-to-json-format –

Cuestiones relacionadas