Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Rest JSON (https://www.delphipraxis.net/182575-rest-json.html)

borstenei 1. Nov 2014 23:00

Rest JSON
 
Hallo,
ich teste gerade die Rest Komponenten mit JSON. Verschiedene Dienste habe ich schon gut "anzapfen" können.Aber ein Problem bleibt wenn zb. ein knoten oder ein Element nicht vorhanden ist wieder erwarten, schmiert die Anwendung ab.
Wie kann ich das vorhandensein eines Eintrags überprüfen...? das hier soll jetzt mal nur als Beispiel dienen....
Delphi-Quellcode:
Title := MainForecast.GetValue('title').Value;
        Publisher := MainForecast.GetValue('publisher').Value;
        PublishedDate := MainForecast.GetValue('publishedDate').Value;
        Description := MainForecast.GetValue('description').Value;
        SeitenAnzahl := MainForecast.GetValue('pageCount').Value;
        Sprache := MainForecast.GetValue('language').Value;
        Autor := MainForecast.GetValue('authors') as TJSONArray;
        Autoren := Autor.Items[0].Value;
        ISBNCode := MainForecast.GetValue('industryIdentifiers') as TJSONArray;
        Code13:= TJSONObject(ISBNCode.Items[1]).GetValue('identifier').Value;
        CodeTyp13 := TJSONObject(ISBNCode.Items[1]).GetValue('type').Value;
        Code10:= TJSONObject(ISBNCode.Items[0]).GetValue('identifier').Value;
        CodeTyp10 := TJSONObject(ISBNCode.Items[0]).GetValue('type').Value;
        Imagelinks := MainForecast.GetValue('imageLinks') as TJSONObject;
        BildPfad := ImageLinks.GetValue('thumbnail').Value;
        Categories := MainForecast.GetValue('categories') as TJSONArray;
        Kategorie := Categories.Items[0].Value;
nur wenn jetzt zb. der Eintrag 'authors' fehlt , bekomme ich eine Fehlermeldung und der Rest wird natürlich auch nicht mehr abgearbeitet.
Meine Frage ist schlicht ....wie kann ich auf nicht vorhandene Knoten/Einträge reagieren..und mit dem nächsten Eintrag fortfahren...
Borstenei

Sir Rufo 2. Nov 2014 00:02

AW: Rest JSON
 
Kuckst du Doku Delphi-Referenz durchsuchenSystem.JSON.TJSONObject und dort die Methoden und Eigenschaften anschauen.

z.B.:
Delphi-Quellcode:
TryGetValue
,
Delphi-Quellcode:
Count
,
Delphi-Quellcode:
Values

borstenei 2. Nov 2014 18:18

AW: Rest JSON
 
Hallo Sir Rufo,
Danke für den Tipp. Aber damit habe ich auch schon rum experimentiert.
Ich komme aber mit dem
Delphi-Quellcode:
TryGetValue
nicht weiter, auch finde ich im Internet kein entsprechendes Sample.
Irgendwie finde ich es ungewöhnlich das niemand das nichtvorhandensein prüft?!.
Ich habe mir das "Delphi Cookbook" von Daniele Teti gekauft aber auch hier in den Beispielen finden nirgends eine überprüfung statt.
Kann mir jemand hier mal auf die Sprünge helfen?
Borstenei

Sir Rufo 3. Nov 2014 00:45

AW: Rest JSON
 
Nun das
Delphi-Quellcode:
TryGetValue
arbeitet genauso wie alle
Delphi-Quellcode:
Try
Varianten (
Delphi-Quellcode:
TryStrToInt
, ...)
Delphi-Quellcode:
if LJSONObject.TryGetValue<string>( 
  { APath } 'author',
  { out AValue } LStr ) then
  WriteLn( 'author found: ', LStr )
else
  WriteLn( 'author not found!' );
oder auf dein Beispiel angewendet
Delphi-Quellcode:
if MainForecast.TryGetValue<string>( 'title', LStr ) then
  Title := LStr
else
  Title := '';
Wenn dir das zu umständlich ist, dann bau dir einfach einen Helper
Delphi-Quellcode:
type
  TJSONValueHelper = class helper for TJSONValue
  public
    function GetValue<T>( const APath: string; ADefault: T ): T;
  end;

function TJSONValueHelper.GetValue<T>( const APath: string; ADefault: T ): T;
begin
  if not TryGetValue<T>( APath, Result )
  then
    Result := ADefault;
end;
und dann geht das einfach so
Delphi-Quellcode:
Title := MainForecast.GetValue<string>( 
  { APath } 'title',
  { ADefault } '' );

borstenei 6. Nov 2014 11:50

AW: Rest JSON
 
Danke Dir Sir Rufo für Deine Mühe,
super schlanke Lösung.
Allerdings bekomme ich das nur umgesetzt wenn Bezeichner vorhanden sind, in diesem Fall
Delphi-Quellcode:
 Categories := MainForecast.GetValue('categories') as TJSONArray;
         Kategorie := Categories.Items[0].Value;
bekomme ich das wieder nicht mit
Delphi-Quellcode:
TryGetValue
umgesetzt.
Ich habe hier jetzt einfach ein
Delphi-Quellcode:
Try Except
eingefügt.
Borstenei

Sir Rufo 6. Nov 2014 13:14

AW: Rest JSON
 
Wieso das, ein simples
Delphi-Quellcode:
If Assigned( Categories ) then
reicht doch aus :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 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