![]() |
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:
Der Knackpunkt die Deserialisierung der Objektlisten ....
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>); |
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; |
AW: JSON mit Superobject
Geht doch ganz hervorragend:
Delphi-Quellcode:
Dein Code sieht aber auch sehr seltsam aus
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.
Delphi-Quellcode:
Und wenn du eventuell - wenn es nicht zu geheim ist - die Fehlermeldung dazuschreiben könntest ...
// Warum sind da ZWEI Punkte???
data..AsObject.S['id']; |
AW: JSON mit Superobject
Crosspost:
![]() Bitte beim nächsten Mal - freundlicherweise - selber eintragen |
AW: JSON mit Superobject
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
![]() ![]() Code:
Delphi-Quellcode:
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.
data := SO(GetRes);
test := data.AsObject.S['id']; ShowMessage(test); Keine Ahnung wieso er genau bei "test := data.AsObject.S['id'];" immer ne Zugriffsverletzung schmeißt. |
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) |
AW: JSON mit Superobject
Das ist wenigstens ein kleiner Hinweis. Ich werd mal meinen Response checken & dann berichten :?
|
AW: JSON mit Superobject
Zitat:
|
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.
|
AW: JSON mit Superobject
Zitat:
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 23:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz