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