AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Zugriffsverletzung bei TJson.JsonToObject<T> mit Laufzeit-Packages
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von E.Schubert · begonnen am 15. Aug 2022 · letzter Beitrag vom 24. Aug 2022
Antwort Antwort
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
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 15. Aug 2022, 14:56
"VJSONValue as TJSONObject" vorab in einer lokalen Variablen zuweisen und schauen ob es da "knallt" oder erst danach.
  Mit Zitat antworten Zitat
E.Schubert

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

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

  Alt 15. Aug 2022, 15:36
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"
}
]
  Mit Zitat antworten Zitat
E.Schubert

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

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

  Alt 23. Aug 2022, 07:58
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
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 23. Aug 2022, 08:45
Weitere Ideen:
1. Du hast im Memo-Feld drei Einträge. Kommt das auch nur mit einem?
2. Debuggen.
  Mit Zitat antworten Zitat
E.Schubert

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

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

  Alt 23. Aug 2022, 08:51
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"?
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 23. Aug 2022, 09:08
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.)
  Mit Zitat antworten Zitat
E.Schubert

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

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

  Alt 24. Aug 2022, 16:38
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 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