2011-02-25 15 views
9

me gustaría analizar esta salida JSON en una aplicación Symbian:JSON en Qt utilizando QVariantMap

[ 
    {"ID":"9","titel":"wouter","plaatsID":"2616","prio":"3"}, 
    {"ID":"8","titel":"pasta","plaatsID":"3780","prio":"3"}, 
    {"ID":"6","titel":"Muts prikken","plaatsID":"3780","prio":"2" 
    {"ID":"5","titel":"doorplannen","plaatsID":"3840","prio":"2"} 
    {"ID":"4","titel":"Gasfles","plaatsID":"3780","prio":"2"} 
] 

Para esto, escribió siguiente código, pero no puede leer los datos. Otros misma salida JSON que trabaja muy bien, pero una salida múltiple no funciona:

 void start::finishedSlot(QNetworkReply * reply) 
    { 
     // Reading attributes of the reply 
     // e.g. the HTTP status code 
     reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); 
    reply->attribute(QNetworkRequest::RedirectionTargetAttribute); 
    // see CS001432 on how to handle this 
    // no error received? 
    if (reply->error() == QNetworkReply::NoError) 
    { 
      QByteArray data = reply->readAll(); 
     bool ok; 
     QVariantMap result = Json::parse(QString(data), ok).toMap(); 

     if(!ok) { 
      qFatal("An error occurred during parsing"); 
      exit(1); 
     } 
     QMapIterator<QString, int> i(result); 
     while (i.hasNext()) { 
      i.next(); 
      cout << i.key() << ": " << i.value() << endl; 
     } 

    ui->log->setText("het gaat goed"); 
    } 
    // Some http error received 
    else 
    { 
    ui->log->setText("gaat NIET goed"); 
    } 
    delete reply; 
} 
+0

¿está el JSON en su pregunta los datos reales que están tratando de analizar? Si es así, contiene varios problemas, p. un corsé y algunas comas están desaparecidas. –

+0

No estoy seguro de cómo funciona QMapIterator, pero cuando analiza una matriz, el último elemento es la longitud. Utilicé qScriptValueToSequence (value, list); –

Respuesta

1
void parse_links(const QScriptValue & value, QList<Link> & cbk_links) 
{ 
    QList<QVariantMap> list; 
    qScriptValueToSequence(value,list); 
    foreach(auto item, list) 
    { 
     Link link; 

     link.yawDeg = item.value("yawDeg").toFloat(); 
     link.panoId = item.value("panoId").toString(); 
     link.road_argb = item.value("road_argb").toString(); 
     link.description = item.value("description").toString(); 
     link.scene = item.value("scene").toInt(); 

     cbk_links.append(link); 
    } 
} 

utilizado para el paso:

"Links": [ 
      { "yawDeg":"18.49", 
       "panoId":"Voal3KQo5FNL67hq7tA8nA", 
       "road_argb":"0x80ffffff", 
       "description":"Knuth-Wintherfeldts Allé", 
       "scene":"0" 
      },   { "yawDeg":"198.49", 
       "panoId":"6RCsAsNoawmh98eOOs7Wzw", 
       "road_argb":"0x80ffffff", 
       "description":"Knuth-Wintherfeldts Allé", 
       "scene":"0" 
      } 
     ] 
3

Está utilizando el programa de análisis de https://github.com/ereilin/qt-json, ¿verdad? Por lo que yo sé, que analizador necesita sus datos JSON para estar siempre un objeto en el nivel superior, para que sus datos tiene que ser algo como

{"somename": [ 
    {"ID":"9","titel":"wouter","plaatsID":"2616","prio":"3"}, 
    {"ID":"8","titel":"pasta","plaatsID":"3780","prio":"3"}, 
    {"ID":"6","titel":"Muts prikken","plaatsID":"3780","prio":"2"}, 
    {"ID":"5","titel":"doorplannen","plaatsID":"3840","prio":"2"}, 
    {"ID":"4","titel":"Gasfles","plaatsID":"3780","prio":"2"} 
    ] } 

Comprobar las respuestas a Best JSON parser for Qt? para algunos programas de análisis alternativos, Recomiendo echar un vistazo a qjson (http://qjson.sourceforge.net/).

5

En Qt 5, tiene soporte para datos JSON.

"Qt proporciona soporte para tratar con datos JSON. JSON es un formato para codificar datos de objetos derivados de Javascript, pero ahora ampliamente utilizado como formato de intercambio de datos en Internet. El soporte JSON en Qt proporciona un fácil uso C++ API para analizar, modificar y guardar datos JSON. También contiene soporte para guardar estos datos en un formato binario que es directamente mmap'able y de muy rápido acceso. Se pueden encontrar más detalles sobre el formato de datos JSON en y en RFC -4627 ".

http://qt-project.org/doc/qt-5/json.html

Y creo que no es difícil portarlos a Qt 4 si es necesario.

Al menos se puede encontrar el código en https://github.com/qtproject/qtbase/tree/5.3/src/corelib/json

Alguien portado QJson * de 5 a 4: (Añadido 2013-07-02) https://github.com/5in4/qjson-backport

Nota: 2012-11-30

Otra persona también señaló que es posible usar QtScript para analizar datos JSON. Si puede leer en chino (si no puede, por favor, tradúzcalo): http://www.cuteqt.com/blog/?p=2261 (Este sitio está desactivado por ahora, olvidó hacer una copia de seguridad a través de Google Reader, y GR también está muerto ... 2013-07-02)

+0

Su último enlace está roto – blottedscience

Cuestiones relacionadas