2012-04-06 19 views
10
{"hi": "hellow", 
"first": 
    {"next":[ 
      {"key":"important_value"} 
     ] 
    } 

} 

Acceso RapidJSON dentro de matriz:biblioteca RapidJSON obtener un valor dentro de una matriz por su índice

esto funciona: cout << "HI VALUE:" << variable["hi"].GetString() << endl; esta es la salida: hellow como se esperaba, el problema es tener acceso a los valores en el interior como si quiero obtener "Important_Value", intenté algo como esto: cout << "Key VALUE:" << variable["first"]["next"][0]["key"].GetString() << endl ; pero esto no funciona, quiero ser capaz de obtener el "important_value" por el primer elemento de la matriz, y en este caso es el [0] el que está causando el error.

¿Cómo hago para obtenerlo por su índice? Espero que esté clara mi explicación.

Gracias de antemano.

Respuesta

20

JSON

{"hi": "hellow", "first": {"next":[{"key":"important_value"} ] } } 

Código:

rapidjson::Document document;  

if (document.Parse<0>(json).HasParseError() == false) 
{ 
    const Value& a = document["first"]; 

    const Value& b = a["next"]; 

    // rapidjson uses SizeType instead of size_t. 
    for (rapidjson::SizeType i = 0; i < b.Size(); i++) 
    { 
     const Value& c = b[i]; 

     printf("%s \n",c["key"].GetString()); 
    }   
} 

imprimirá important_value

+1

esto no responde a nada, haga un ejemplo de mi ejemplo con los corchetes [], los corchetes son el problema porque es una posición automática de las matrices, la primera es 0, siguiente es 1 y así sucesivamente .. Lo que hiciste, ya lo hice, intentas obtener el valor como en mi ejemplo, usa la misma fuente. – Grego

+0

Pruebe esto ........ – mola10

+0

Esto es exactamente lo que estoy buscando para acceder al objeto anidado en el miembro de la matriz. +1 – haxpor

2

Me di cuenta de esto en el archivo tutorial.cpp;

// Note: 
//int x = a[0].GetInt();   // Error: operator[ is ambiguous, as 0 also mean a null pointer of const char* type. 
int y = a[SizeType(0)].GetInt(); // Cast to SizeType will work. 
int z = a[0u].GetInt();   // This works too. 

No lo he probado, pero es posible que desee probar uno de estos;

variable de [ "primero"] [ "siguiente"] [0U] [ "clave"]. GetString()

variable de [ "primero"] [ "siguiente"] [SizeType (0)] [" tecla "]. GetString()

13

[actualización]

por el trabajo inteligente de contribuyentes, RapidJSON ahora puede eliminar la ambigüedad literal 0 de cadena. Entonces el problema ya no sucede.

https://github.com/miloyip/rapidjson/issues/167


El problema, como mjean señaló, el compilador es incapaz de determinar si se debe llamar el descriptor de acceso miembro de objeto o el elemento de matriz de acceso, por literial 0:

GenericValue& operator[](const Ch* name) 
GenericValue& operator[](SizeType index) 

El uso de [0u] o [SizeType(0)] puede solucionar esto.

Otra forma de hacer frente a este problema es dejar de usar la versión sobrecargada para el operador []. Por ejemplo, usando operator() para un tipo de acceso. O usando funciones normales, por ejemplo, GetMember(), GetElement(). Pero no tengo preferencia en esto ahora mismo. Otras sugerencias son bienvenidas.

0

Si desea acceder a él con los soportes, a continuación, puede utilizar el siguiente:

int i=0; 
cout<<"Key VALUE:"<<variable["first"]["next"][i]["key"].GetString()<<endl ; 

de salida: valor de la clave: important_value

Se trabajó para mí.

Cuestiones relacionadas