2014-10-09 43 views
0

喜,我有这样的文字在JSON: (不返回所有在一行中)JSON解析使用Qt

[ 
     { 
      "ERROR":false, 
      "USERNAME":"Benutzer", 
      "FORMAT":"HUMAN", 
      "LATITUDE_MIN":84, 
      "LATITUDE_MAX":36, 
      "LONGITUDE_MIN":5, 
      "LONGITUDE_MAX":20, 
      "RECORDS":203 
     }, 
     [ 
      { 
       "MMSI":233434540, 
       "TIME":"2014-10-09 06:19:06 GMT", 
       "LONGITUDE":8.86037, 
       "LATITUDE":54.12666, 
       "COG":347, 
       "SOG":0, 
       "HEADING":236, 
       "NAVSTAT":0, 
       "IMO":0, 
       "NAME":"HELGOLAND", 
       "CALLSIGN":"DK6068", 
       "TYPE":90, 
       "A":20, 
       "B":15, 
       "C":4, 
       "D":4, 
       "DRAUGHT":2, 
       "DEST":"BREMERHAVEN", 
       "ETA":"00-00 00:00" 
      }, 
      { 
       "MMSI":319072300, 
       "TIME":"2014-10-09 06:08:53 GMT", 
       "LONGITUDE":9.71578, 
       "LATITUDE":54.31949, 
       "COG":343.6, 
       "SOG":0, 
       "HEADING":197, 
       "NAVSTAT":5, 
       "IMO":1012189, 
       "NAME":"M.Y. ESTER III", 
       "CALLSIGN":"ZGED3", 
       "TYPE":37, 
       "A":31, 
       "B":35, 
       "C":7, 
       "D":6, 
       "DRAUGHT":3.5, 
       "DEST":"SCHACT AUDORF", 
       "ETA":"09-16 08:00" 
      } 

    // many more lines but the Json IS VALID. 

    ] 
    ] 

我会分析它,并把在一个MYSQL表。 并非所有,只有名字和MMSI第一。 但由于其不要在foreach跳这个不认为我的东西CONSLE:

bool ok = true; 

// my json data is in reply & ok is a boolean 
QVariantList result = parser.parse(reply, &ok).toList(); 

foreach(QVariant record, result) { 
    QVariantMap map = record.toMap(); 
    qDebug() << map.value("NAME"); 
} 

有什么不对? 当我调试时,我只看到它不在foreach中跳转。 我使用QJson库:QJson :: Parser解析器;但请任何人都可以告诉我我做错了什么?

+0

刚才看到您需要的Qt4的解决方案。我建议你尝试[qjson4](https://code.google.com/p/qjson4/),正如我在我的回答中所建议的那样。我也给出了一个代码片段。 – nnb 2014-10-10 12:01:32

+0

您是否找到了解决此问题的备用解决方案?如果是,请与其他人分享。 – nnb 2014-10-14 18:18:20

回答

1

你的代码看起来像你迭代的顶层数组,而你正在寻找的数据是嵌套的数组,这实际上是顶层阵列的第二个项目英寸所以,你需要迭代内部数组中的项目。

下面的代码对我的作品与样品JSON:

QVariantList result = parser.parse(reply, &ok).toList().at(1).toList(); 
foreach (const QVariant &item, result) { 
    QVariantMap map = item.toMap(); 
    qDebug() << map["NAME"].toString(); 
    qDebug() << map["MMSI"].toLongLong(); 
} 
+0

是的,但我必须使用Qt 4. – thelittlePanda 2014-10-09 07:28:08

+0

然后你已经在使用QJson了。在调用'parse()'之后是'ok'' true'? – 2014-10-09 07:31:09

+0

@thelittlePanda,我已经更新了我对这个问题的猜测。 – 2014-10-09 07:37:29

1

如果您正在使用QT5或以上,你可以使用由QJsonDocumentQJsonObjectQJsonArray提供的真棒功能。

我抄你的JSON到一个文件名为test.txt在我的d-驱动器和下面的代码工作正常。

QJsonDocument jsonDoc; 
QByteArray temp; 
QFile file("D://test.txt"); 
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) 
{ 
    temp = file.readAll(); 
} 
jsonDoc = QJsonDocument::fromJson(temp); 
QJsonArray jsonArray = jsonDoc.array().at(1).toArray(); //Since you are interested in the json array which is the second item and not the first json object with error 
for(int i =0; i < jsonArray.size(); ++i) 
{ 
    QJsonObject jsonObj = jsonArray.at(i).toObject(); 
    int mmsi = jsonObj.find("MMSI").value().toInt(); 
    QString name = jsonObj.find("NAME").value().toString(); 
    qDebug() << mmsi; 
    qDebug() << name; 
} 

如果你要坚持的Qt4,你可以尝试使用qjson4库,试图模仿“QJsonDocument”,这是QT5的一部分的行为。