Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Deserialisierung eines Json-Strings (https://www.delphipraxis.net/182309-deserialisierung-eines-json-strings.html)

Ralle1 16. Okt 2014 15:15

Deserialisierung eines Json-Strings
 
Hallo!
Ich bin auf der Suche nach einer eleganten Lösung, wie ich beliebige Json-Strings in Klassen deserialisieren kann. Unten ein Beispiel, wie ich es z.Z. löse. Leider muss dann jede Klasse die FillFromJson Methode haben. Gibt es nicht via Spring4D Möglichkeiten, das zu automatisieren?



Delphi-Quellcode:
type
  TRequest = class
    Code : integer;
    Message : string;
    procedure FillFromJson(Json: string);
  end;


procedure TRequest.FillFromJson(Json: string);
var
  JsonObject : TlkJSONObject;
begin
  if Json='' then exit;
  JsonObject := TlkJSON.ParseText(Json) as TlkJSONobject;
  if not Assigned(JsonObject) then exit;
  try
    Code := StrToIntDef(GetFieldValueAsString('Code'), 0);
    Message := GetFieldValueAsString('Message');
  finally
    JsonObject.Free;
  end;
end;

jaenicke 16. Okt 2014 15:38

AW: Deserialisierung eines Json-Strings
 
Was möchtest du erreichen? Bestehende Klassendefinitionen benutzen und mit den Daten füllen? Dazu findest du z.B. hier etwas:
http://www.danieleteti.it/2009/09/01...n-delphi-2010/

mjustin 16. Okt 2014 18:27

AW: Deserialisierung eines Json-Strings
 
Zitat:

Zitat von Ralle1 (Beitrag 1276236)
Hallo!
Ich bin auf der Suche nach einer eleganten Lösung, wie ich beliebige Json-Strings in Klassen deserialisieren kann.

SuperObject kann ab Delphi 2010 Objekte direkt über RTTI serialisieren.

Codebeispiele:

https://code.google.com/p/superobjec...705abe94f1ebf6

http://stackoverflow.com/questions/1...-of-properties

Habe damit aber noch nicht selber gearbeitet.

Sir Rufo 16. Okt 2014 18:53

AW: Deserialisierung eines Json-Strings
 
Da gibt es auch was von Delphipharm
http://blogs.embarcadero.com/stephen...-line-of-code/

Der schöne Günther 16. Okt 2014 19:40

AW: Deserialisierung eines Json-Strings
 
Und dabei ganz besonders den Kommentar von Herrn Monien beachten. Dazu auch mein passendes Thema: http://www.delphipraxis.net/182105-f...unmarshal.html

Ralle1 16. Okt 2014 19:46

AW: Deserialisierung eines Json-Strings
 
ich muss wohl noch dazu sagen, dass ich in XE2 unterwegs bin.

REST.JSON Unit ist somit leider für mich aus dem Rennen :-(
Aber genau sowas suche ich! SuperObject klingt auch ganz passend, das werde ich mal testen.

Wenn jemand weitere sachdienlich Hinweise geben kann, immer gerne her damit :-D

jaenicke 16. Okt 2014 19:50

AW: Deserialisierung eines Json-Strings
 
Das von mir eingangs gepostete Marshalling funktioniert ab Delphi 2010. ;-)
Das nutzen wir auch.

Ralle1 17. Okt 2014 05:36

AW: Deserialisierung eines Json-Strings
 
Hört sich auch top an. Wird ausprobiert.

Ralle1 21. Okt 2014 16:14

AW: Deserialisierung eines Json-Strings
 
ich habe ein Problem beim UnMarshal.

das TJSONUnMarshal.UnMarshal erwartet einen Json inkl "type" und "id".
Type ist soweit kein Problem. Aber woher kriege ich eine ID ?

Wenn ich ein Objekt erzeuge und daraus einen String generiere, sieht es so aus:
{"type":"UnitRequest.TRequest","id":1,"fields":{"M essage":"Hier ein Text","Code":401}}
Mache ich daraus wieder ein Objekt, funktioniert es wunderbar.
Nur bekomme ich aus dem Fremdsystem nur folgenden String:
{"Message":"Hier ein Text","Code":401}
Setze ich type/id/fields manuel drum herum, knallt es bei mir.

Kann mir jemand auf die Sprünge helfen ?

Danke!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 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