Einzelnen Beitrag anzeigen

E.Schubert

Registriert seit: 21. Mai 2012
8 Beiträge
 
#1

Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages

  Alt 15. Aug 2022, 14:45
Hallo in die Runde,
nach der Umstellung auf Delphi 11 habe ich das Problem, dass der Aufruf von TJson.JsonToObject<T> in meinem Projekt mit Laufzeit-Packages eine Zugriffsverletzung wirft. Wir das Programm ohne Laufzeit-Packages kompiliert läuft alles super. Das Problem trat erst nach der Umstellung auf Delphi 11 auf, mit 10.4 lief das ganze noch super. Zum besseren Verständnis hier noch mal der Quelltext:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TLizenzDocument = class
    F_ID: string;
    F_Ref: string;
  public
    property _ID: string read F_ID write F_ID;
    property _Ref: string read F_Ref write F_Ref;
  end;
  TLizenzDocumentArray = array of TLizenzDocument;

  TForm1 = class(TForm)
    Memo1: TMemo;
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    function ConvertJsonToMobile5LizenzDocumentArray(AContent: string): TLizenzDocumentArray;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses
  System.Json,
  Rest.Json,
  REST.Json.Types;

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  VLizenzen: TLizenzDocumentArray;
  I: Integer;
begin
  ListBox1.Items.Clear;
  VLizenzen := ConvertJsonToMobile5LizenzDocumentArray(Memo1.Text);
  for I := 0 to Length(VLizenzen) - 1 do
    ListBox1.Items.Add(VLizenzen[I]._ID);
end;

function TForm1.ConvertJsonToMobile5LizenzDocumentArray(AContent: string): TLizenzDocumentArray;
var
  VJSONArray: TJSONArray;
  VJSONValue: TJSONValue;
  VJSONObject: TLizenzDocument;
begin
  VJSONArray := TJSONObject.ParseJSONValue(AContent) as TJSONArray;
  Result := [];
  for VJSONValue in VJSONArray do
  begin
    //--- hier wird die Zugriffsverletzung geworfen ---
    VJSONObject := TJson.JsonToObject<TLizenzDocument>(VJSONValue as TJSONObject);
    Result := Result + [VJSONObject];
  end;
end;

end.
Hat jemand eine Idee, wo ich hier ansetzen könnte.

Vielen Dank
  Mit Zitat antworten Zitat