AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials JSON mit Superobject

JSON mit Superobject

Ein Tutorial von Bummi · begonnen am 21. Sep 2012 · letzter Beitrag vom 18. Sep 2014
Antwort Antwort
Benutzerbild von Bummi
Bummi
Registriert seit: 15. Jun 2010
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 ....
Miniaturansicht angehängter Grafiken
json.png  
Angehängte Dateien
Dateityp: zip Demoprojekt_SRC.zip (120,7 KB, 197x aufgerufen)
Dateityp: zip Demoprojekt_exe.zip (621,5 KB, 93x aufgerufen)
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
 
Benutzerbild von Back2Code
Back2Code

 
Delphi XE7 Professional
 
#2
  Alt 17. Sep 2014, 12:51
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;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

 
Delphi 10 Seattle Enterprise
 
#3
  Alt 17. Sep 2014, 14:16
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

 
Delphi 10 Seattle Enterprise
 
#4
  Alt 17. Sep 2014, 14:54
Crosspost: http://stackoverflow.com/questions/2...th-superobject

Bitte beim nächsten Mal - freundlicherweise - selber eintragen
  Mit Zitat antworten Zitat
Benutzerbild von Back2Code
Back2Code

 
Delphi XE7 Professional
 
#5
  Alt 17. Sep 2014, 15:00
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.
Miniaturansicht angehängter Grafiken
3failvq.png   k5zfbwl.jpg  

Geändert von TBx (18. Sep 2014 um 12:21 Uhr) Grund: Bilder angehängt, bitte nicht extern verlinken
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

 
Delphi 10 Seattle Enterprise
 
#6
  Alt 17. Sep 2014, 15:22
Weil mein Demo-Programm mit den Daten arbeitet, die du hier als Beispiel zeigst.

Dein Programm arbeitet mit anderen Daten ... (siehe auch SO)
  Mit Zitat antworten Zitat
Benutzerbild von Back2Code
Back2Code

 
Delphi XE7 Professional
 
#7
  Alt 17. Sep 2014, 15:35
Das ist wenigstens ein kleiner Hinweis. Ich werd mal meinen Response checken & dann berichten
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

 
Delphi 10 Seattle Enterprise
 
#8
  Alt 17. Sep 2014, 15:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von Back2Code
Back2Code

 
Delphi XE7 Professional
 
#9
  Alt 18. Sep 2014, 09:13
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

 
Delphi 10 Seattle Enterprise
 
#10
  Alt 18. Sep 2014, 09:32
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.


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!
  Mit Zitat antworten Zitat
Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 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