Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages (https://www.delphipraxis.net/211213-zugriffsverletzung-bei-tjson-jsontoobject-t-mit-laufzeit-packages.html)

E.Schubert 15. Aug 2022 13:45

Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages
 
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

freimatz 15. Aug 2022 13:56

AW: Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages
 
"VJSONValue as TJSONObject" vorab in einer lokalen Variablen zuweisen und schauen ob es da "knallt" oder erst danach.

E.Schubert 15. Aug 2022 14:36

AW: Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages
 
Die Zuweisung zu einer lokalen Variablen funktioniert noch, die Zugriffsverletzung kommt erst bei JsonToObject.

Kleiner Nachtrag:
Der JSON-String aus dem Memofeld sieht folgendermaßen aus:

[
{
"_id":"lizenz-200001_M003",
"_rev":"7-1efb9d247b31f0ae7f0333ee29fcb3da"
},
{
"_id":"lizenz-200001_M004",
"_rev":"7-bedf20011f838cc5e7ef26902c1acb9f"
},
{
"_id":"lizenz-200001_M005",
"_rev":"9-a4b2bb73ef02df15e43168551b42d4d4"
}
]

E.Schubert 23. Aug 2022 06:58

AW: Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages
 
Guten Morgen,
ich konnte das Problem noch etwas eingrenzen: Der Fehler kommt nur im Debug-Modus, wenn ich das Programm ohne Debugger starte läuft es perfekt. Weiterhin habe ich es mit einer älteren Delphi Version (28.0.42600.6491) getestet, auch da läuft das Programm noch fehlerfrei. Erst in der Version 28.0.44500.8973 kommt bei mir der Fehler. Vielleicht hat jemand ein ähnliches Problem bzw. kann mir hier einen Anhaltspunkt geben.

Vielen Dank und viele Grüße

freimatz 23. Aug 2022 07:45

AW: Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages
 
Weitere Ideen:
1. Du hast im Memo-Feld drei Einträge. Kommt das auch nur mit einem?
2. Debuggen.

E.Schubert 23. Aug 2022 07:51

AW: Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages
 
zu 1.: die Anzahl der Einträge ist nicht relevant, ich habe das auch schon mit anderen JSON-Objekten versucht, das Problem ist immer das selbe
zu 2.: was meinst Du mit "Debuggen"?

freimatz 23. Aug 2022 08:08

AW: Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages
 
Nun ja, Breakpoint setzen davor wo die Zugriffsverletzung kommt, dann hinsteppen mit F7 und schauen was da so passiert.
Und noch
3. minimales Beispielprojekt erstellen (ohne Form u.a.)

E.Schubert 24. Aug 2022 15:38

AW: Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages
 
Hallo,
ich habe jetzt mal in den "sauren Apfel gebissen" und mich durch den Quelltext gewühlt. Dabei habe ich festgestellt, dass der Fehler nicht in TJson auftritt, sondern dass das Problem bei RTTI liegt. Ich würde den Thread hier mal schließen und das Problem in einem Neuen noch mal genau beschreiben.


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