Moin Zusammen,
ich hatte von der KI bei einer Performance-Analyse mal den Tipp bekommen, dass ich statt REST.Json -> TJson.JsonToObject mal System.Json.Serializer -> TJsonSerializer.Create().Deserialize benutzen sollte. Was hatte ich mich gefreut, dass das so viel schneller lief. Hatte bei meiner Freude völlig übersehen, dass einfach gar keine Werte in das Objekt übernommen wurden.
Ich hatte also ein Test-Projekt angelegt und das mal auf ein minimales Beispiel runter gebrochen.
Delphi-Quellcode:
unit main;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.ExtCtrls;
type
TTest =
class
private
FTest :
String;
FTest2 : Integer;
public
property Test :
String read FTest
write FTest;
property Test2 : Integer
read FTest2
write FTest2;
end;
type
TfrmMain =
class(TForm)
pnlIn: TPanel;
spTrenner: TSplitter;
pnlOut: TPanel;
lblInput: TLabel;
memInput: TMemo;
btnStart: TButton;
lblOutput: TLabel;
memOutput: TMemo;
btnClose: TButton;
procedure btnCloseClick(Sender: TObject);
procedure btnStartClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
frmMain: TfrmMain;
implementation
uses
System.JSON.Serializers,
Rest.Json;
{$R *.dfm}
procedure TfrmMain.btnCloseClick(Sender: TObject);
begin
Close();
end;
procedure TfrmMain.btnStartClick(Sender: TObject);
var
tmp : TTest;
js : TJsonSerializer;
begin
// V1:
{
tmp := TJson.JsonToObject<TTest>(memInput.Lines.Text);
try
memOutput.Lines.Text := TJson.ObjectToJsonString(tmp);
except
memOutput.Lines.Text := '';
end;
}
// V2:
js := TJsonSerializer.Create();
try
tmp := js.Deserialize<TTest>(memInput.Lines.Text);
try
try
memOutput.Lines.Text := TJson.ObjectToJsonString(tmp);
except
on E:
Exception do
memOutput.Lines.Text := '
Fehler: ' + E.
Message;
end;
finally
tmp.Free();
end;
finally
js.Free();
end;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
memInput.Lines.Text := '
{"Test":"Wert1","Test2":12}';
end;
end.
Version 1 mit TJson.JsonToObject funktioniert wunderbar.
Version 2 mit js.Deserialize funktioniert nicht.
Die KI kam darauf mit lustigen Tipps, dass ich statt "public" doch "published" verweden soll,
oder alle Private-Eigenschaften mit "[JsonIn]" als Attribut erweitern sollte,
aber guess what, hat natürlich nicht funktioniert.
Wir verwenden Delphi 11.
Hat da jemand eine Lösung für?
Liebe Grüße
Incocnito