2014-10-09 81 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的一部分的行爲。