Versuch mal, ob das den Fehler (zumindest an der Stelle) behebt:
Delphi-Quellcode:
if Assigned(TJSONObject(Value).GetValue('name')) then
PlName := TJSONObject(Value).GetValue('name').Value;
Falls ja, könnte man über eine lokale Variable vom Typ TJSONValue nachdenken, die man zuerst befüllt, im Anschluss auf nil prüft und erst danach versucht, den Wert auszulesen.
Der Fehler wird so tatsächlich behoben, oder besser gesagt, umgangen. Die Idee mit der lokalen Variablen habe ich mit einer Funktion realisiert, gewissermaßen ein Wrapper für den eigentlichen Aufruf von GetValue. Der hilft auch den Code aller übrigen Methoden, die diese Funktion benutzen, deutlich zu vereinfachen:
Delphi-Quellcode:
Function TSpManager.GetValue(value:TJSONValue; key: string): String;
var jv: TJSONValue;
begin
result := '';
jv := TJSONObject(value).GetValue(lowercase(key));
If jv <> NIL Then result := jv.value;
end;
[edit] Oder man benutzt die generische Funktion TryGetValue<T> von TJSONObject, das ist etwas bequemer.
Delphi-Quellcode:
if not TJSONObject(Value).TryGetValue<string>('name', PlName) then
PlName := '';
Das ist ja noch 'cooler'. So funktioniert's tatsächlich:
Delphi-Quellcode:
Function TSpManager.GetValue(value:TJSONValue; key: string): String;
begin
if not TJSONObject(Value).TryGetValue<string>(lowercase(key), result) then
result := '';
end;
Vielen Dank für die Tipps, aber das alles sind ja eigentlich 'nur' Workarounds. Ich halte es für einen veritablen Bug, wenn in System.JSON intern übergebene Parameter zu einer Accessviolation führen, weil sie nicht auf Validität überprüft werden.
Gruß LP