2013-04-09 14 views
37

Qt5 hat einen neuen JSon-Parser, den ich verwenden möchte. Das Problem ist, dass es nicht allzu klar ist, was die Funktionen in Laienausdrücken tun und wie man Code damit schreibt. Das oder ich könnte es falsch lesen.So erstellen/lesen/schreiben Sie JSon-Dateien in Qt5

Ich möchte den Code zum Erstellen einer JSON-Datei in Qt5 kennen und was "einkapselt" bedeutet.

+0

http://qjson.sourceforge.net/ –

+0

Min Lin: QJson ist mit Qt5 irgendwie veraltet (nicht sicher, dass es sogar portiert ist), da es seine eigene Json-Implementierung bringt. Jim Kieger: Was hast du probiert? –

+0

[Diese Referenzseite] (https://qt-project.org/doc/qt-5.0/qtcore/qjsondocument.html) enthält die Funktionen QJsonDocument :: QJsonDocument() und QJsonDocument :: QJsonDocument (const QJsonDocument und andere) .Ich habe versucht QJsonDocument, aber es scheint nichts zu erstellen. –

Antwort

71

Beispiel (da 1 kein gültiges json Dokument ist, während {foo: 1} ist.): Read json aus Datei

/* test.json */ 
{ 
    "appDesc": { 
     "description": "SomeDescription", 
     "message": "SomeMessage" 
    }, 
    "appName": { 
     "description": "Home", 
     "message": "Welcome", 
     "imp":["awesome","best","good"] 
    } 
} 


void readJson() 
    { 
     QString val; 
     QFile file; 
     file.setFileName("test.json"); 
     file.open(QIODevice::ReadOnly | QIODevice::Text); 
     val = file.readAll(); 
     file.close(); 
     qWarning() << val; 
     QJsonDocument d = QJsonDocument::fromJson(val.toUtf8()); 
     QJsonObject sett2 = d.object(); 
     QJsonValue value = sett2.value(QString("appName")); 
     qWarning() << value; 
     QJsonObject item = value.toObject(); 
     qWarning() << tr("QJsonObject of description: ") << item; 

     /* in case of string value get value and convert into string*/ 
     qWarning() << tr("QJsonObject[appName] of description: ") << item["description"]; 
     QJsonValue subobj = item["description"]; 
     qWarning() << subobj.toString(); 

     /* in case of array get array and convert into string*/ 
     qWarning() << tr("QJsonObject[appName] of value: ") << item["imp"]; 
     QJsonArray test = item["imp"].toArray(); 
     qWarning() << test[1].toString(); 
    } 

OUTPUT

QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"})) 
"QJsonObject of description: " QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) 
"QJsonObject[appName] of description: " QJsonValue(string, "Home") 
"Home" 
"QJsonObject[appName] of value: " QJsonValue(array, QJsonArray(["awesome","best","good"])) 
"best" 

Beispiel: Lesen json aus string

Assign json bespannen wie unten verwenden readJson() Funktion gezeigt vor:

val = 
' { 
     "appDesc": { 
      "description": "SomeDescription", 
      "message": "SomeMessage" 
     }, 
     "appName": { 
      "description": "Home", 
      "message": "Welcome", 
      "imp":["awesome","best","good"] 
     } 
    }'; 

OUTPUT

QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"})) 
"QJsonObject of description: " QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) 
"QJsonObject[appName] of description: " QJsonValue(string, "Home") 
"Home" 
"QJsonObject[appName] of value: " QJsonValue(array, QJsonArray(["awesome","best","good"])) 
"best" 
+0

Ich fand dieses wirklich gute Beispiel einen hell leuchtenden Stern der Hoffnung und bin dem Beispiel genau gefolgt. Wenn ich jedoch das Beispiel debugge, werden die Werte der Einträge als Null angezeigt. Ist dies das einzige Beispiel "Schritt für Schritt" zum Erstellen, Lesen und Schreiben einer JSON-Datei in QT? Ich kann nicht herausfinden, was ich falsch machen könnte. Verwenden von QT Creator 3.0.1. Danke – Shawn

+0

@Shawn Suchen Sie auf der Registerkarte Hilfe in QT Creator nach JSON Save Game Example. Dies zeigt ziemlich genau alles, was man tun muss, um JSON-Werte (einschließlich Arrays) zu lesen und zu schreiben. [JSON Save Game Example] (http://qt-project.org/doc/qt-5/qtcore-savegame-example.html) –

+0

Sie könnten die Umwandlung von utf-8 Bytes in utf-16 und zurück (QString, ' toUtf8() ') wenn Sie stattdessen' QByteArray' verwenden. – jfs

-1

Ein Beispiel, wie man das benutzt, wäre großartig. Es gibt ein paar Beispiele unter der Qt forum, aber Sie haben Recht, dass die offizielle Dokumentation erweitert werden sollte.

QJsonDocument für sich selbst in der Tat nichts produziert, müssen Sie die Daten hinzufügen. Dies geschieht über die Klassen QJsonObject, QJsonArray und QJsonValue. Die Top-Level Element muss entweder ein Array oder ein Objekt sein

+1

Nachdem ich mir das angesehen habe, denke ich, dass ich bei QSettings bleiben werde, anstatt JSon für bestimmte Dinge zu verwenden. Danke für Ihre Hilfe. –

0

Leider , viele JSON C++ Bibliotheken haben APIs, die nicht trivial zu verwenden sind, während JSON einfach zu verwenden war.

Also habe ich versucht jsoncpp vom gSOAP tools auf der doc JSON in einer der Antworten oben gezeigt, und dies ist der Code mit jsoncpp erzeugte ein JSON-Objekt in C++ zu konstruieren, die dann im JSON-Format geschrieben ist std :: cout:

value x(ctx); 
x["appDesc"]["description"] = "SomeDescription"; 
x["appDesc"]["message"] = "SomeMessage"; 
x["appName"]["description"] = "Home"; 
x["appName"]["message"] = "Welcome"; 
x["appName"]["imp"][0] = "awesome"; 
x["appName"]["imp"][1] = "best"; 
x["appName"]["imp"][2] = "good"; 
std::cout << x << std::endl; 

und dies ist der Code, der von jsoncpp erzeugt JSON von std parsen :: cin und seine Werte extrahieren (replace USE_VAL nach Bedarf):

value x(ctx); 
std::cin >> x; 
if (x.soap->error) 
    exit(EXIT_FAILURE); // error parsing JSON 
#define USE_VAL(path, val) std::cout << path << " = " << val << std::endl 
if (x.has("appDesc")) 
{ 
    if (x["appDesc"].has("description")) 
    USE_VAL("$.appDesc.description", x["appDesc"]["description"]); 
    if (x["appDesc"].has("message")) 
    USE_VAL("$.appDesc.message", x["appDesc"]["message"]); 
} 
if (x.has("appName")) 
{ 
    if (x["appName"].has("description")) 
    USE_VAL("$.appName.description", x["appName"]["description"]); 
    if (x["appName"].has("message")) 
    USE_VAL("$.appName.message", x["appName"]["message"]); 
    if (x["appName"].has("imp")) 
    { 
    for (int i2 = 0; i2 < x["appName"]["imp"].size(); i2++) 
     USE_VAL("$.appName.imp[]", x["appName"]["imp"][i2]); 
    } 
} 

Dieser Code verwendet die JSON C++ API von gSOAP 2.8.28. Ich erwarte nicht, dass die Leute die Bibliotheken wechseln, aber ich denke, dieser Vergleich hilft, JSON C++ - Bibliotheken in die richtige Perspektive zu bringen.