Einzelnen Beitrag anzeigen

Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
118 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Problem bei JSON-Abfrage

  Alt 20. Sep 2020, 16:53
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
  Mit Zitat antworten Zitat