Seite 1 von 2

Json im QByteArray

Verfasst: 17. Dezember 2009 13:27
von toem
Hallo,
ich habe eine Textdatei die ich als QByteArray einlese. Der Aufbau der Datei ist:

{ID: 1, Name: "name.txt", Grösse: 456645}
[Binärdaten]
{ID: 1, Sonstiges: "blablabla"}

Ich lese die Datei Zeilenweise ein, bekomme also ohne Probleme das
{ID: 1, Name: "name.txt", Grösse: 456645}
in das QByteArray. Wie erhalte nun auf einfachem Weg Zugriff auf die einzelnen Werte?
Ich habe das via QScriptEngine probiert, aber das klappt nicht so wie ich es mir vorstelle.

Verfasst: 17. Dezember 2009 13:52
von upsala
Auf dieser Seite: http://json.org/ stellt alles was du wissen must, um dir selbst einen kleinen Parser zu schreiben inkl. fertiger Parser für fast jede Programmiersprache.

Verfasst: 17. Dezember 2009 13:57
von toem
Ich möchte das aber nicht mit einer Json Lib machen, sondern mit den Bordmitteln von QT.

Verfasst: 17. Dezember 2009 14:47
von pfid
Dann musst du das wohl von Hand, mit Qt Bordmitteln, parsen.

Verfasst: 17. Dezember 2009 15:03
von toem
Das ist mit schon klar.
Kann mir denn jemand einen Tip geben, wie ich so einen Parser schreiben muss?

Verfasst: 17. Dezember 2009 15:28
von upsala
In dem du den String mit Hilfe der QString-Funktionen nach den Regeln die auf der oben angegebenen Seite stehen zerlegst?

Verfasst: 17. Dezember 2009 15:48
von toem
Schon klar, danke.

Trotzdem wäre für nähere Angaben dankbar.

Verfasst: 18. Dezember 2009 10:38
von toem
Also, ich versuch das grade mit RexExp und einer StringList:

Code: Alles auswählen

void MainWindow::parseString(QString str)
{
    QRegExp rExp("([A-Za-z]+):(.+?(?=(?<!\[.+),|}))");
    QStringList list;
    list = str.split(rExp);

    for (int i=0; i < list.size(); i++)
    {
        qDebug() << "Liste " << list.at(i).toLocal8Bit().constData();
    }
}
Nur anscheinend greift der RegExp nicht.

{ID: 17, Image: "Demo1.tif", Type: "TIFF", Width: 2436, Height: 3464, Length: 86437, CheckSum: d6241b81339e5d831d8c7202125b7db2}
{ID: 18, Tags: ["EIN", "BAUM", "WEIHNACHT"]}

Ist oben im Code was falsch?

Verfasst: 18. Dezember 2009 11:26
von upsala
Das was du oben wolltest läst sich mit einer RegEx zerlegen. Für das was du jetzt willst brauchst du eine 'StateMachine' und QVariant.

Verfasst: 18. Dezember 2009 11:45
von toem
Warum brauch ich eine StateMachine?
Was ist den der Unterschied zu dem vorigen? Das müsste doch ebenfalls via RegExp gehen.

Verfasst: 18. Dezember 2009 11:54
von upsala
{ID: 1, Sonstiges: "blablabla"}
{ID: 18, Tags: ["EIN", "BAUM", "WEIHNACHT"]}
Also ich seh hier einmal
QString=>int, QString=>QString
und einmal
QString=>int, QString=>QStringList(QString, QString, QString)

Verfasst: 18. Dezember 2009 11:55
von toem
Wie würde denn erst einmal der RegExp für
QString=>int, QString=>QString
aussehen?
Ich komm mit diesem RegExp einfach nicht klar.

Verfasst: 18. Dezember 2009 12:12
von upsala

Code: Alles auswählen

(\w+):\s*("[^"]*"|[^"])
Und mit dieser RegEx, jedes Wertepaar nacheinander rausholen.

Verfasst: 18. Dezember 2009 12:21
von toem
Thx, datt hilft doch

Verfasst: 4. Januar 2010 08:26
von toem
Hallo nochmal,

ich war leider bislang krank. Ich habe doch noch Probleme mit dem RegExp.

Code: Alles auswählen

QRegExp rx("(\w+):\s*("[^"]*"|[^"])");
Kann ich leider nicht ausführen, da die doppleten Hochkommatas stören. Wie muss ich das richtig einsetzen?

Ich machs jetzt via

Code: Alles auswählen

QRegExp rx("(\\w+):\\s*(\"[^\"]*\"|[^\"])");
Aber dann ist das Ergebnis falsch.

In der Liste von

Code: Alles auswählen

{ID: 1, Sonstiges: "blablabla"} 
{ID: 18, Tags: ["EIN", "BAUM", "WEIHNACHT"]} 
steht dann als Ergebnis:

Code: Alles auswählen

"ID", "Tags"
aber es fehlen die Einträge in den Klammern [], wober ich die Ausgabe von ID und Tags gerne unterdrücken würde.