Json im QByteArray

Alles rund um die Programmierung mit Qt
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Json im QByteArray

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

Ich möchte das aber nicht mit einer Json Lib machen, sondern mit den Bordmitteln von QT.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Dann musst du das wohl von Hand, mit Qt Bordmitteln, parsen.
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

Das ist mit schon klar.
Kann mir denn jemand einen Tip geben, wie ich so einen Parser schreiben muss?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

In dem du den String mit Hilfe der QString-Funktionen nach den Regeln die auf der oben angegebenen Seite stehen zerlegst?
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

Schon klar, danke.

Trotzdem wäre für nähere Angaben dankbar.
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

Warum brauch ich eine StateMachine?
Was ist den der Unterschied zu dem vorigen? Das müsste doch ebenfalls via RegExp gehen.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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)
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

(\w+):\s*("[^"]*"|[^"])
Und mit dieser RegEx, jedes Wertepaar nacheinander rausholen.
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

Thx, datt hilft doch
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag 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.
Antworten