2017-06-26 21 views
-1

Qt5を実行しています。私はjsonファイルから値を読み取ろうとします。それは私がしようとしたコードの下だQJsonArrayを使用してQt5(C++)でJSONファイル(配列)を解析する方法

test.json

[{"w":188,"h":334,"th":0.350000,"l":232,"r":420,"t":133,"b":467,"p":0.713963,"n":"person"}] 
[{"w":127,"h":141,"th":0.350000,"l":1152,"r":1279,"t":162,"b":303,"p":0.408129,"n":"person"},{"w":179,"h":339,"th":0.350000,"l":230,"r":409,"t":131,"b":470,"p":0.698172,"n":"person"}] 

:JSONファイルは、上記1のようなものです。どのようにjsonファイル構造を読むのですか?

QString val; 
QFile file; 
file.setFileName("test.json"); 
file.open(QIODevice::ReadOnly | QIODevice::Text); 
//file is readall 
val = file.readAll(); 
file.close(); 
qWarning() << val; //print consol 
QJsonDocument jsonDocument = QJsonDocument::fromJson(val.toUtf8()); 
//get data array !!! 
QJsonObject jsonObject = jsonDocument.object(); 
QJsonArray jsonArray = jsonObject["w"].toArray(); 
qWarning() << jsonArray[0].toString(); 
+0

実際の問題とは何ですか?期待どおりに動作しないのはなぜですか?なぜですか? – KjMag

+2

[QJsonDocument、QJsonObject、QJsonArrayを使用してJSONをパースするQtの複製](https://stackoverflow.com/questions/19822211/qt-parsing-json-using-qjsondocument-qjsonobject-qjsonarray) – eyllanesc

+0

このテキストはJSONフォーマット。 '[values1] [values2]' not json – eyllanesc

答えて

0

データは、(悪い形成され、RFC 7159を参照してください)JSON形式を持っているが、それは部品である場合、私たちがしなければならないことは、それを分離することで、そのために私たちはQRegularExpresionを使用しないため、およびデータが適切な形式であることを確認すると、コードはコードに似ています。

コード:

#include <QCoreApplication> 
#include <QFile> 
#include <QDebug> 
#include <QRegularExpression> 
#include <QJsonDocument> 
#include <QJsonArray> 
#include <QJsonObject> 

int main(int argc, char *argv[]){ 

    QCoreApplication a(argc, argv); 

    QFile file("test.json"); 
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){ 
     qWarning() << "Could not open file!"; 
     return 0; 
    } 
    const auto& data = QString(file.readAll()); 
    file.close(); 

    QRegularExpression regex("\\[|\\]"); 
    const auto& jsons = data.split(regex); 

    for(const auto& json : jsons) 
     if(!json.trimmed().isEmpty()){ 
      const auto& formattedJson = QString("[%1]").arg(json); 
      const auto& doc = QJsonDocument::fromJson(formattedJson.toUtf8()); 

      if(doc.isArray()) 
       for(const auto& item : doc.array()){ 
        const auto& obj = item.toObject(); 
        const auto& keys = obj.keys(); 

        for(const auto& key : keys){ 
         if(key == "n") 
          qDebug() << key << obj[key].toString(); 
         else 
          qDebug() << key << obj[key].toInt(); 
        } 
       } 
     } 

    return a.exec(); 
} 

出力:

"b" 467 
"h" 334 
"l" 232 
"n" "person" 
"p" 0 
"r" 420 
"t" 133 
"th" 0 
"w" 188 
"b" 303 
"h" 141 
"l" 1152 
"n" "person" 
"p" 0 
"r" 1279 
"t" 162 
"th" 0 
"w" 127 
"b" 470 
"h" 339 
"l" 230 
"n" "person" 
"p" 0 
"r" 409 
"t" 131 
"th" 0 
"w" 179 
+0

正規表現を使用する代わりに ''\ n''で分割しないのはなぜですか? – Azeem

+0

@Azeem私は最も一般的なケースを想定していますが、同じことを適用することも考えましたが、データは1行に収まるかもしれません。 – eyllanesc

+0

@Azeem最悪のケースについて考えるのは常に良いことです。確かなことは、日付が '[]'の間にあることだけです。 – eyllanesc

関連する問題