Thema: Delphi JSON richtig parsen

Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#1

JSON richtig parsen

  Alt 23. Mär 2017, 10:17
Hi,

ich versucht seit Stunden ein JSON-String zu parsen, aber ich raff's nicht. Ich könnte mal ein bisschen Schützenhilfe von euch gebrauchen

Mein JSON-String sieht so aus:
Code:
[{"Lfdnr":"1","Fehlernummer":"1","Programmversion":"4.6.1.123","DBVersion":"15","Status":"1","Kategorie":"Testfehler","Dringlichkeit":"1","NoWork":"0","Kurzbeschreibung":"Das ist ein Testfehler","Langbeschreibung":"Das ist der Langtext von Testfehler","Benutzer":"HC","BenutzerName":"Hobbycoder","Datum":"2017-03-22 00:00:00","BehInVersion":"","BehDatum":"0000-00-00 00:00:00","BehVon":""},{"Lfdnr":"2","Fehlernummer":"1","Programmversion":"4.6.1.123","DBVersion":"15","Status":"1","Kategorie":"Testfehler","Dringlichkeit":"1","NoWork":"0","Kurzbeschreibung":"Das ist ein Testfehler","Langbeschreibung":"Das ist der Langtext von Testfehler","Benutzer":"HC","BenutzerName":"Hobbycoder","Datum":"2017-03-22 00:00:00","BehInVersion":"","BehDatum":"0000-00-00 00:00:00","BehVon":""},{"Lfdnr":"3","Fehlernummer":"2","Programmversion":"4.6.1.155","DBVersion":"200","Status":"2","Kategorie":"Nocheinekategorie","Dringlichkeit":"3","NoWork":"1","Kurzbeschreibung":"kb","Langbeschreibung":"lb","Benutzer":"WT","BenutzerName":"Willi Tester","Datum":"2017-03-22 00:00:00","BehInVersion":"","BehDatum":"0000-00-00 00:00:00","BehVon":""}]
Ziel ist es alle Elemente des Array in Objekte zu überführen.
Die Objekte sehen (etwas gekürzt) so aus:
Delphi-Quellcode:
 TErrorMessage=class
    property Lfdnr: Integer read FLfdnr write SetLfdnr;
    property Fehlernummer: string read FFehlernummer write SetFehlernummer;
    property Programmversion: string read FProgrammversion write SetProgrammversion;
    property DBVersion: string read FDBVersion write SetDBVersion;
    property Status: TEMStatus read FStatus write SetStatus;
    property Kategorie: string read FKategorie write SetKategorie;
    property Dringlichkeit: TEMDringlichkeit read FDringlichkeit write SetDringlichkeit;
    property NoWork: Boolean read FNoWork write SetNoWork;
    property Kurzbeschreibung: string read FKurzbeschreibung write SetKurzbeschreibung;
    property Langbeschreibung: string read FLangbeschreibung write SetLangbeschreibung;
    property Benutzer: string read FBenutzer write SetBenutzer;
    property Benutzername: string read FBenutzername write SetBenutzername;
    property Datum: TDateTime read FDatum write SetDatum;
    property BehInVersion: string read FBehInVersion write SetBehInVersion;
    property BenDatum: TDateTime read FBenDatum write SetBenDatum;
    property BenVon: string read FBenVon write SetBenVon;
  end;
Das Objekt habe ich hier nur mal aufgeführt, damit man sehen kann wie ich das ablegen will.

Mein Source dafür sie so aus:
Delphi-Quellcode:
procedure TErrorMessageList.GetListFromWeb(path: string);
var
  http: TIdHTTP;
  jsonstr: string;
  st: TStringStream;
  jsonval: TJSONValue;
  jsondsz: TJSONValue;
  em: TErrorMessage;
begin
  http:=TIdHTTP.Create(nil);
  st:=TStringStream.Create;
  try
    self.Clear;
    http.Get(path+'getlist.php', st);
    st.Position:=0;
    jsonstr:=st.ReadString(st.Size);
    try
      jsonval:=TJSONObject.ParseJSONValue(jsonstr);
// if json is TJSONArray then
// begin
        for jsondsz in (jsonval as TJSONArray) do
        begin
          Try
            em:=TErrorMessage.Create;
            em.Lfdnr:=StrToInt(TJSONString(jsondsz.GetValue('lfdnr')).Value);
            em.Fehlernummer:=jsondsz.GetValue('fehlernummer').ToString;
            em.Programmversion:=jsondsz.GetValue('programmversion').ToString;
            em.DBVersion:=jsondsz.GetValue('dbversion').ToString;
            em.Status:=TEMStatus(StrToInt(jsondsz.GetValue('status').ToString));
            em.Kategorie:=jsondsz.GetValue('kategorie').ToString;
            em.Dringlichkeit:=TEMDringlichkeit(StrToInt(jsondsz.GetValue('dringlichkeit').ToString));
            em.NoWork:=Int2Bool(StrToInt(jsondsz.GetValue('nowork').ToString));
            em.Kurzbeschreibung:=jsondsz.GetValue('kurzbeschreibung').ToString;
            em.Langbeschreibung:=jsondsz.GetValue('langbeschreibung').ToString;
            em.Benutzer:=jsondsz.GetValue('benutzer').ToString;
            em.Benutzername:=jsondsz.GetValue('benutzername').ToString;
            self.Add(em);
          except
            em.Free;
          End;
        end;
      //end;
    finally
    end;
  finally
    http.Free;
    st.Free;
  end;
end;
Nur so, läuft er nicht. Sieht auch ein bisschen verrissen aus, weil ich auf Grund der Beispiele im Internet das eine oder andere ausprobiert habe, aber nicht wirklich zu einem lauffähigen Ergebnis gekommen bin.
Nach Möglichkeit will ich nur System.json verwenden, und keine anderen oder fremde Units.

Wäre für eure Hilfe sehr dankbar.

Gruß Hobbycoder.
  Mit Zitat antworten Zitat