Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   JSON mit Superobject (https://www.delphipraxis.net/170530-json-mit-superobject.html)

Bummi 21. Sep 2012 10:50

JSON mit Superobject
 
Liste der Anhänge anzeigen (Anzahl: 3)
Nachdem ich mich kurzfristig einarbeiten musste und kaum brauchbare (funktionierende) Beispiele fand, habe ich mich entschlossen meine Erkenntnisse laufend hier zu veröffentlichen, falls jemand ähnliche Probleme haben sollte.
(wenn unpassend bitte löschen ...)
Voraussetzungen Delphi ab 2009 und Superobjects (mit für Delphi > 2009 entfernten IFDefs 210 ), bei der beiliegenden Version wurde da ich XE verwende, FHeapData durch FValueData ersetzt.

Teststruktur bei meinem ersten Versuch waren
Delphi-Quellcode:
  Type
  TPosition=Class(TObject)
    Nr:Integer;
    Bezeichnung:String;
    Preis:Currency;
  End;

  TPositionenList=Class(TObjectList<TPosition>);
  TRechnung=Class(TObject)
    RechnungsNummer:String;
    Positionen:TPositionenList;
    Constructor Create;
    Destructor Destroy;override;
  End;
  TRechnungsList=Class(TObjectList<TRechnung>);

  TKunde=Class(TObject)
    ID:Integer;
    Name:String;
    Vorname:String;
    Geboren:TDatetime;
    Rechnungen:TRechnungsList;
    Constructor Create(aID:Integer=0;aName:String='';aVorname:String='';aGeboren:TDateTime=0);
    Destructor Destroy;override;
  End;

  TKundenList=Class(TObjectList<TKunde>);
Der Knackpunkt die Deserialisierung der Objektlisten ....

Back2Code 17. Sep 2014 12:51

AW: JSON mit Superobject
 
Wie liest man denn bestehende JSON Daten aus?

Hab durch nen GET an ne API einiges an JSON-Daten zurückgeliefert bekommen und werd aus der Readme nicht sonderlich schlau.

{
"id": 3,
"description": "Mithilfe des Gitlab API Tester Programm ist es simpel Gitlab API Issues automatisiert zu erstellen. Das folgende Programm dient zu Veranschaulichung & Funktionsweise der Parameter.",
"default_branch": "master",
"public": false,
"archived": false,


Möchte in dem Fall "id" also die "3" auslesen, funktioniert aber leider nicht so wie es sollte:

Delphi-Quellcode:
procedure TMainForm.GetAllProjects(APIUrl, Token: String);
var
  HTTP     : TIdHTTP;
  Cookie   : TIdCookieManager;
  SSL      : TIdSSLIOHandlerSocketOpenSSL;
  GetRes   : String;
  Params   : TStringList;
  data     : ISuperObject;
  dataArray : TSuperArray;
  test:    String;
  i, i2: Integer;
  Item : TListItem;
begin
  HTTP                 := TIdHTTP.Create(NIL);
  Cookie               := TIdCookieManager.Create(HTTP);
  SSL                  := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
  HTTP.CookieManager   := Cookie;
  HTTP.IOHandler       := SSL;
  HTTP.HandleRedirects := True;
  HTTP.Request.UserAgent :=
  'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
  HTTP.AllowCookies := True;

  Params := TStringList.Create;
  Cookie.CookieCollection.Clear;

  APIUrl := APIUrl + 'projects/all?private_token=' + Token;
  GetRes := HTTP.Get(APIUrl);

  data                 := SO(GetRes);
   test := data..AsObject.S['id']; // get a string; //crap will net :(

  HTTP.Free;
end;

Sir Rufo 17. Sep 2014 14:16

AW: JSON mit Superobject
 
Geht doch ganz hervorragend:
Delphi-Quellcode:
program dp_170530;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  SysUtils,
  superobject;

const
  JSON_RESPONSE = //
    '{"id": 3,' + //
    '"description": "Mithilfe des Gitlab API Tester Programm ist es simpel Gitlab API Issues automatisiert zu erstellen. Das folgende Programm dient zu Veranschaulichung & Funktionsweise der Parameter.",'
    + '"default_branch": "master",' + //
    '"public": false,' + //
    '"archived": false}';

procedure TestJson;
var
  data: ISuperObject;
  test: string;
  testint : Integer;
begin
  data := SO( JSON_RESPONSE );

  test := data.AsObject.S['id'];
  Writeln( test );
  test := data.S['id'];
  Writeln( test );
  testint := data.I['id'];
  Writeln( testint );
end;

begin
  try
    TestJson;
  except
    on E: Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;
  ReadLn;

end.
Dein Code sieht aber auch sehr seltsam aus
Delphi-Quellcode:
// Warum sind da ZWEI Punkte???
data..AsObject.S['id'];
Und wenn du eventuell - wenn es nicht zu geheim ist - die Fehlermeldung dazuschreiben könntest ...

Sir Rufo 17. Sep 2014 14:54

AW: JSON mit Superobject
 
Crosspost: http://stackoverflow.com/questions/2...th-superobject

Bitte beim nächsten Mal - freundlicherweise - selber eintragen

Back2Code 17. Sep 2014 15:00

AW: JSON mit Superobject
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Sir Rufo (Beitrag 1272893)
Geht doch ganz hervorragend:

Und wenn du eventuell - wenn es nicht zu geheim ist - die Fehlermeldung dazuschreiben könntest ...

Ich hab absolut keine Ahnung warum bei mir der Fehler hochkommt:

Fehlermeldung
IDE-Ansicht

Code:

Delphi-Quellcode:
  data                 := SO(GetRes);
  test := data.AsObject.S['id'];
  ShowMessage(test);
Ich mein die Doku hab ich mir davor ja schon durchgelesen und mir das Hirn zermatert wieso ich immer ne Zugriffsverletzung bekomme...Dein Demoprogramm von dir Rufo läuft übrigens einwandfrei. Auch nochmal ein dickes Dankeschön für deine Mühe.

Keine Ahnung wieso er genau bei "test := data.AsObject.S['id'];" immer ne Zugriffsverletzung schmeißt.

Sir Rufo 17. Sep 2014 15:22

AW: JSON mit Superobject
 
Weil mein Demo-Programm mit den Daten arbeitet, die du hier als Beispiel zeigst.

Dein Programm arbeitet mit anderen Daten ... (siehe auch SO)

Back2Code 17. Sep 2014 15:35

AW: JSON mit Superobject
 
Das ist wenigstens ein kleiner Hinweis. Ich werd mal meinen Response checken & dann berichten :?

Sir Rufo 17. Sep 2014 15:37

AW: JSON mit Superobject
 
Zitat:

Zitat von Back2Code (Beitrag 1272913)
Das ist wenigstens ein kleiner Hinweis. Ich werd mal meinen Response checken & dann berichten :?

Auf SO wurde dir auch schon ganz klar der Hinweis schlechthin gegeben. Lies dort die Kommentare.

Back2Code 18. Sep 2014 09:13

AW: JSON mit Superobject
 
Die Gitlab API liefert "[" & "]" bei einem Response mit aus. Damit kam Superobject nicht klar. Also Problemlösung war in meinem Fall den API Response per String Replace nach den Klammern aufzurufen.

Sir Rufo 18. Sep 2014 09:32

AW: JSON mit Superobject
 
Zitat:

Zitat von Back2Code (Beitrag 1272951)
Die Gitlab API liefert "[" & "]" bei einem Response mit aus. Damit kam Superobject nicht klar. Also Problemlösung war in meinem Fall den API Response per String Replace nach den Klammern aufzurufen.

:shock:

Ok, anscheinend möchtest oder willst du nicht lesen. So what, wenn es jetzt für dich funktioniert dann ist es ja gut.

Für zukünftige Leser: Es ist absolut kein Problem mit SuperObject auch solche Arrays zu verarbeiten.
Bitte nicht nachmachen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz