AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Casting von TJSONObject

Ein Thema von t2000 · begonnen am 17. Dez 2024 · letzter Beitrag vom 17. Dez 2024
Antwort Antwort
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
236 Beiträge
 
Delphi 12 Athens
 
#1

Casting von TJSONObject

  Alt 17. Dez 2024, 08:13
Delphi-Version: 12 Athens
Vielleicht ne grundsätzliche Frage zur Herangehensweise.

Ich bekomme in einer Funktion einen Parameter LParam: TJSONObject
Aus diesem soll das darin enthaltene Feld 'JSONData', welches auch wieder ein JSON-Object ist, herausgeholt werden.

Alles nicht schwer. Hier geht es um das Casting.
Habe den Code seit bestimmt 3 Jahren gehabt und jetzt erst das Problem bemerkt. (Ich kann nicht mit Sicherheit sagen, warum erst jetzt. Aber ich habe den Einsatzzweck ein wenig verändert)

Es soll also eine Kopie der JSON Daten in das Feld FJSONData kopiert werden.
Delphi-Quellcode:
var
  LParam: TJSONObject;
  LVal: TJSONValue;
begin

    LVal := LParam.GetValue( 'JSONData');
    if LVal.Null then
      FJSONData := nil
    else
      //FJSONData := TJSONObject( LVal).Clone as TJSONObject; // hat sehr lange funktioniert. Ja eine möglich Exception war beabsichtigt.
      FJSONData := TJSONObject( TJSONObject( LVal).Clone);
Ich vermute, da LVal ein TJSONValue ist (da ja auch .Clone ein TJSONValue liefert) macht mir das casten mit "as" die Exception. (Die enthaltenen Daten sind ein korrektes JSON Objekt)
Wenn ich nun mit TJSONObject() caste, entfällt die überprüfung und es gibt keine Exception.

Ist meine Vermutung richtig oder sollte das casten mit "as" auch funktionieren?
Was ist vorgefallen, dass dieser Fehler erst nach ca. 3 Jahren auftritt?

Ich habe sehr viele Stellen in meinem Code, bei denen ich "as" nutze (anstelle von TType()) Falls dort ein falscer Typ kommt, ist die Exception sinnvoll. Aber bei TJSONValue : TJSONObject den Fehler zu melden wäre fatal.

Meinungen?

VG
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
236 Beiträge
 
Delphi 12 Athens
 
#2

AW: Casting von TJSONObject

  Alt 17. Dez 2024, 10:06
Man muss über Probleme schreiben und/oder reden. Dann kommt man selber drauf.

Das Casting ist völlig in Ordnung. In diesem Fall egal welche Variante.

Mein Fehler war, dass ich zwar auf Vorhandensein des JSON-Namen getestet hatte, aber nicht ob JSON-Value auch <> nil ist. Und das war hier der Fall.

Ein Casting TJSONObject(nil) funktioniert.
Ein Casting nil as TJSONObject aber nicht.

Ich könnte jetzt den ganzen Beitrag löschen, aber vielleicht hilft er ja irgendwann irgendjemanden weiter.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#3

AW: Casting von TJSONObject

  Alt 17. Dez 2024, 10:16
Vielleicht hat sich die Struktur oder der Inhalt der JSON-Daten geändert. Es könnte sein, dass LVal.Clone an dieser Stelle nicht mehr immer ein TJSONObject ist.

Du könntest möglicherweise LVal.Clone.ClassName prüfen, wenn der Fehler auftritt.

Zur Abfrage könnte man den Typ vorab mit "is" testen, was aber dann zweimal Clone aufruft, und das ist auch nicht so super.

Edit: Ich sehe, Du hast schon selbst geantwortet, schicke ich aber trotzdem noch ab ...

Das hier sollte aber OK sein
Delphi-Quellcode:
LVal := LParam.GetValue('JSONData');

if Assigned(LVal) and not LVal.Null then
begin
  // Sichere Zuweisung mit Clone
  FJSONData := TJSONObject(LVal.Clone) as TJSONObject;
end
else
  FJSONData := nil;
  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 19:58 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