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
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.
Kann ich leider nicht ausführen, da die doppleten Hochkommatas stören. Wie muss ich das richtig einsetzen?
Ich machs jetzt via
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:
aber es fehlen die Einträge in den Klammern [], wober ich die Ausgabe von ID und Tags gerne unterdrücken würde.