2011-07-01 13 views
8
{ 
    "menu": 
    { 
     "foo": true, 
     "bar": "true", 
     "value": 102.3E+06, 
     "popup": 
     [ 
      {"value": "New", "onclick": "CreateNewDoc()"}, 
      {"value": "Open", "onclick": "OpenDoc()"}, 
     ] 
    } 
} 

¿Cómo puedo obtener el valor de onclick?¿Cómo puedo acceder a una matriz JSON con boost :: property_tree?

+0

Hay dos cosas llamadas 'onclick'; ¿Cuál de ellos quieres usar? –

+2

Esta es su tercera pregunta hoy en Boost.PropertyTree. Tiene bonita [documentación decente] (http://www.boost.org/doc/libs/1_46_1/doc/html/property_tree.html). Quizás deberías leerlo. –

+3

@Nicol - Irónicamente, el ejemplo del OP es en realidad de la documentación de Boost. http://www.boost.org/doc/libs/1_41_0/doc/html/boost_propertytree/parsers.html#boost_propertytree.parsers.json_parser – Perception

Respuesta

16

iterar a través de los hijos del nodo menu.popup y extraer el onclick valores:

void print_onclick_values(const ptree& node) 
{ 
    BOOST_FOREACH(const ptree::value_type& child, 
        node.get_child("menu.popup")) { 
     std::cout 
      << "onclick: " 
      << child.second.get<std::string>("onclick") 
      << "\n"; 
    } 
} 

Las impresiones de función:

onclick: CreateNewDoc() 
onclick: OpenDoc() 

N.B. Eliminar la coma final del ejemplo:

{"value": "Open", "onclick": "OpenDoc()"}, 

No se puede acceder a ellos de forma individual de la matriz mediante un único get<string>(path)get_child(path) o llamada. The manual says:

Dependiendo de la ruta de acceso, el resultado en cada nivel no puede ser completamente determinado, es decir, si la misma clave aparece varias veces, lo que niño está elegido no es especificado. Esto puede provocar que la ruta no se resuelva aunque haya un descendiente con esta ruta. Ejemplo:

a -> b -> c 
    -> b 

El camino "A.B.C" tendrá éxito si la resolución de "b" elige el primero tal nodo, pero fallará si elige el segundo.

Los elementos de la matriz JSON tienen todos la cadena vacía como nombre. Se puede acceder al valor onclick un elemento de matriz con

void print_arbitrary_onclick_value(const ptree& node) 
{ 
    std::cout << node.get<std::string>("menu.popup..onclick") << "\n"; 
} 

pero no saber con qué elemento se intenta el acceso de onclick.

+0

de esta manera, podemos obtenerlo. Pero quiero obtenerlo a través de la ruta de la declaración pt.get. – wyz365889

+0

@ wyz365889 No puedes. He actualizado mi respuesta. – antonakos

+0

Sí. Como esto, sé que no puedo obtenerlo. Pero si tengo acceso a una matriz JSON con jsoncpp, y puedo obtenerla a través de la ruta de json. Así que creo que puedo obtenerlo a través de la declaración pt.get. Pero no sé qué hacer. string s = "{\" age \ ": 26, \" persona \ ": [{\" id \ ": 1, \" estudio \ ": [{\" idioma \ ": \" chino \ "}, {\ "language1 \": \ "English \"}], \ "name \": \ "chen \"}, {\ "id \": 2, \ "name \": \ "zhang \"}] , \ "nombre \": \ "huchao \"} "; ptree pt; secuencia (s) de secuencia de cadenas; read_json (stream, pt); cadena s2 = pt.get ("persona." "Estudio. [1].idioma "); cout << s2 << endl; – wyz365889

Cuestiones relacionadas