[gelöst] JSON mit SuperObject parsen

Rund um die LCL und andere Komponenten
Antworten
catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

[gelöst] JSON mit SuperObject parsen

Beitrag von catweasel »

Moin

Nachdem der Versuch größere Datenmengen von einer Webseite zu parsen nicht wirklich zufriedenstellend war, will jetzt versuchen das über JSON zu realisieren.
Dazu habe ich die Unit SuperObject von http://www.progdigy.com/ installiert.

Es sollte angeblich ganz einfach sein, allerdings bekomme ich da irgendwie
keinen Ansatz.
Ich hatte da irgendwo ein Beispiel gefunden wie JSON-Daten damit eingeladen werden und das Beispiel funktioniert auch ganz gut, allerdings finde ich nicht heraus wie ich das für "meine" Daten anpassen muß.

Hat jemand Erfahrung mit JSON oder vielleicht sogar mit diesem SuperObject?

Ich habe hier mal das Beispiel mit den originalen Daten und meinen Daten angehängt.

Gruß
Michael


Code: Alles auswählen

uses SuperObject;
 
 
 
var
  s: string;
  o: ISuperObject;
  i: Integer;
begin
 
  //Beispiel Daten
  {
  s := '{ "accounting" : [ ' +
    '{ "firstName" : "John", ' +
      '"lastName" : "Doe", ' +
      '"age" : 23 }, ' +
    '{ "firstName" : "Mary", ' +
      '"lastName" : "Smith", ' +
      '"age" : 32 } ' +
      '] }';
  }
 
 
 //Reale Daten
 s:=' { "cgi_json_version": "1.4.0",'+
    '"status": {'+
    '"service_status": ['+
 
    '{ "host": "Netbook", '+
    '"service": "Memory Usage", '+
    '"status": "CRITICAL", '+
    '"last_check": "03-07-2011 19:44:08", '+
    '"duration": "3d  8h 27m 35s", '+
    '"attempts": "3/3", '+
    '"status_information": "Keine Route zum Zielrechner"},'+
 
    '{ "host": "Netbook", '+
    '"service": "NSClient++ Version", '+
    '"status": "CRITICAL", '+
    '"last_check": "03-07-2011 19:41:58", '+
    '"duration": "3d  8h 26m 23s", '+
    '"attempts": "3/3", '+
    '"status_information": "Keine Route zum Zielrechner"},'+
 
    '{ "host": "Netbook", '+
    '"service": "Uptime", '+
    '"status": "CRITICAL", '+
    '"last_check": "03-07-2011 19:43:16", '+
    '"duration": "3d  8h 25m 11s", '+
    '"attempts": "3/3", '+
    '"status_information": "Keine Route zum Zielrechner"}'+
    ']'+
    '}'+
    '}';
 
 
 //Beispiel Daten funktionieren
 //o := SO(s).o['accounting'];
 
 //Reale Daten funktionieren nicht
 o := SO(s).o['service_status'];
 
 
 //erst einmal alle Daten auf einmal anzeigen
 for i := 0 to o.AsArray.Length - 1 do begin
    ShowMessage(o.AsArray[i].AsString);
 end;
end;
Zuletzt geändert von catweasel am So 17. Jul 2011, 14:08, insgesamt 3-mal geändert.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: JSON mit SuperObject parsen

Beitrag von m.fuchs »

Nimm mal

Code: Alles auswählen

o := SO(s).o['status'].o['service_status'];
Dein JSON ist ja eine Property namens service_status eines Objekts das in der Property status des Hauptobjekts hängt.

hth
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: JSON mit SuperObject parsen

Beitrag von catweasel »

m.fuchs hat geschrieben:Nimm mal

Code: Alles auswählen

o := SO(s).o['status'].o['service_status'];
Dein JSON ist ja eine Property namens service_status eines Objekts das in der Property status des Hauptobjekts hängt.
So funktionierts
Danke :)

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: [Gelöst] JSON mit SuperObject parsen

Beitrag von catweasel »

Moin

Ich habe mich etwas zu früh gefreut :(

Leider mußte ich feststellen das scheinbar jedes Backslash-Zeichen "\" das im Servicenamen
o.AsArray.o['service'].AsString
drinsteht gelöscht wird.
In meinem Fall sollte im Feld stehen: "C:\ Drive Space", im ListView kommt aber nur "C: Drive Space" an, ohne Backslash.

Wenn im ursprünglichen

Code: Alles auswählen

showmessage(Str.DataString);

noch alle Zeichen vorhanden sind, so fehlt der \ im Servicefeld wenn ich die Zeile

Code: Alles auswählen

ListView1.Items.Item[zeile].SubItems.Add(o.AsArray[i].o['service'].AsString);
im ListView schreiben will.

Woran kann das liegen?

Hier noch ein Ausschnitt aus meinem Programm wo der Fehler auftritt:

Code: Alles auswählen

procedure TMainForm.auswertung;
var i     :integer;
    zeile :integer=0;
    o     :ISuperObject;
begin
 
  o := SO(Str.DataString).o['status'].o['service_status'];
 
  //hier ist der \ noch im Servicenamen drin
  showmessage(Str.DataString);
 
  for i := 0 to o.AsArray.Length - 1 do begin
               ListView1.Items.Add;
               ListView1.Items.Item[zeile].Caption:=o.AsArray[i].o['host'].AsString;
               ListView1.Items.Item[zeile].SubItems.Add(o.AsArray[i].o['service'].AsString);
 
               //hier ist der \ im Servicenamen weg
               showmessage(o.AsArray[i].o['service'].AsString);
 
               ListView1.Items.Item[zeile].SubItems.Add(o.AsArray[i].o['status'].AsString);
               ListView1.Items.Item[zeile].SubItems.Add(o.AsArray[i].o['last_check'].AsString);
               ListView1.Items.Item[zeile].SubItems.Add(o.AsArray[i].o['duration'].AsString);
               ListView1.Items.Item[zeile].SubItems.Add(o.AsArray[i].o['attempts'].AsString);
               ListView1.Items.Item[zeile].SubItems.Add(o.AsArray[i].o['status_information'].AsString);
               inc(zeile);
  end;
end;
Gruß
Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: [Gelöst] JSON mit SuperObject parsen

Beitrag von m.fuchs »

catweasel hat geschrieben:
Leider mußte ich feststellen das scheinbar jedes Backslash-Zeichen "\" das im Servicenamen
o.AsArray.o['service'].AsString
drinsteht gelöscht wird.


Na wenn das nur scheinbar so ist, dann ist es doch egal. :wink: SCNR

catweasel hat geschrieben:In meinem Fall sollte im Feld stehen: "C:\ Drive Space", im ListView kommt aber nur "C: Drive Space" an, ohne Backslash.

Das liegt vermutlich daran, dass ein einzelnes \ in JSON nicht zulässig ist. Der Backslash dient als Steuerzeichen, \n bedeutet zum Beispiel neue Zeile. Wenn du wirkliche einen Backslash benötigst, dann muss er so kodiert sein: \\, also "C:\\ Drive Space"

hth
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: [Gelöst] JSON mit SuperObject parsen

Beitrag von catweasel »

m.fuchs hat geschrieben:Das liegt vermutlich daran, dass ein einzelnes \ in JSON nicht zulässig ist. Der Backslash dient als Steuerzeichen, \n bedeutet zum Beispiel neue Zeile. Wenn du wirkliche einen Backslash benötigst, dann muss er so kodiert sein: \\, also "C:\\ Drive Space"
Danke für den Hinweis.
Ich habe es jetzt so gemacht das vorhandene Backslash einfach über StringReplace verdoppelt werden (ersetze \ durch \\), dann funktioniert´s :)

Noch einen schönen Sonntag
gruß
Michael

Antworten