AGB  ·  Datenschutz  ·  Impressum  







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

Wie geht das: JSON Parser

Ein Thema von wurzelsepp1 · begonnen am 24. Mär 2023 · letzter Beitrag vom 24. Mär 2023
Antwort Antwort
wurzelsepp1

Registriert seit: 9. Dez 2012
107 Beiträge
 
Delphi 3 Professional
 
#1

Wie geht das: JSON Parser

  Alt 24. Mär 2023, 13:03
Moin Gemeinde,

eine der gefürchteten Anfängerfragen:

Ich möchte eine JSON-Antwort aus Wordpress komfortablel zerlegen. Der Abruf von dem Webserver funktioniert wunderbar, der Parser meldet einen "Fehler bei Typumwandlung". Warum das so ist, verstehe ich allerdings nicht..

Delphi-Quellcode:
  Var
    jValue :TJSONValue;
    Obj: TJsonObject;


  RESTRequest1.Execute;
  jValue := RESTResponse1.JSONValue;
  
  // Im Memo steht nun die JSON Antwort, so wie ich sie erwarte.
  Memo1.Text := jValue.ToString;

  // Hier soll nun ein Feld aus der Antwort ausgelesen werden. An der Stelle tritt dan der Fehler auf.
  Obj := RESTResponse1.JSONValue as TJSONObject;
  
  Memo1.Lines.Add('ID: ' + Obj.GetValue('id').ToString);
Könnte mir einer der JSON-Götter kurz sagen, was ich da falsch mache?

Btw: Die JSON-Daten sehen übrigens so aus (stark gekürzt):

Code:
[
  {
    "id": 799,
    "name": "Ship Your Idea",
    "slug": "ship-your-idea-22",
  }
]
Und eine Frage noch:
Wie komme ich eigentlich an die übrigen Datensätze? Die JSON Antwort enthält ganz viele, der hier gekürzten Datensätze.

Danke & VG
Alex
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie geht das: JSON Parser

  Alt 24. Mär 2023, 13:10
Du interpretierst die Antwort als "JSON Object", allerdings ist deine Antwort ein Array, erkennbar an den eckigen Klammern, das nur aus einem Element besteht. Dieses eine Element wiederum ist ein Objekt.

Du könntest also ein RESTResponse1.JSONValue as TJSONArray machen und dann mit den Methoden des Arrays aus dem ersren Element dein Objekt fischen.

Edit: gerade nochmal deine zweite Frage gesehen: mit dem JSONArray kannst du dann auch durch alle anderen Elemente der Antwort durchgehen und dort dann jeweils auf die einzelnen Items zugreifen.
  Mit Zitat antworten Zitat
wurzelsepp1

Registriert seit: 9. Dez 2012
107 Beiträge
 
Delphi 3 Professional
 
#3

AW: Wie geht das: JSON Parser

  Alt 24. Mär 2023, 14:51
Du interpretierst die Antwort als "JSON Object", allerdings ist deine Antwort ein Array, erkennbar an den eckigen Klammern, das nur aus einem Element besteht. Dieses eine Element wiederum ist ein Objekt.

Du könntest also ein RESTResponse1.JSONValue as TJSONArray machen und dann mit den Methoden des Arrays aus dem ersren Element dein Objekt fischen.

Edit: gerade nochmal deine zweite Frage gesehen: mit dem JSONArray kannst du dann auch durch alle anderen Elemente der Antwort durchgehen und dort dann jeweils auf die einzelnen Items zugreifen.
Ja! Vielen Dank. Das hatte ich gesucht.

Eine Frage bleibt dann doch noch:

Der Datensatz enthält verschachtelte Arrays, die teils Daten und teils keine daten enthalten.
Ich würde nun gern vor der Verarbeitung auslesen, wie viele Elemente das Sub-Array hat. Die Syntax dafür habe ich noch nicht gefunden...

Ich lese die Daten aus dem Sub-Array so:

  Memo1.Lines.Add('Bild ID: ' + aObj.Items[0].GetValue<string>('images[0].id') ); Die Anzahl der Elemente des Subarrays "images" müsste ich natürlich wissen, um später auch alle Bilder lesen zu können oder aber ein leeres Array abfangen zu können.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wie geht das: JSON Parser

  Alt 24. Mär 2023, 15:00
Delphi-Quellcode:
  Var
    jValue :TJSONValue;
    jArray: TJSONArray;
    Obj: TJsonObject;


  RESTRequest1.Execute;
  jValue := RESTResponse1.JSONValue;
  
  // Im Memo steht nun die JSON Antwort, so wie ich sie erwarte.
  Memo1.Text := jValue.ToString;

  jArray := RESTResponse1.JSONValue as TJSONArray;

  // ist überhaupt was im Array?
  if jArray.Count>0 then begin
    obj:=jArray.Items[0] as TJSONobject
    [... hier dann was mit dem obj machen ...]
  end;

  // oder alle Elemente durchgehen...
  for var i:=0 to jArray.Count-1 do begin
     [... mit jedem Item irgendwas machen ...]
  end;
Das sollte vielleicht nochmal einen Ansatz liefern, um etwas mehr mit dem Zeug arbeiten zu können.
  Mit Zitat antworten Zitat
wurzelsepp1

Registriert seit: 9. Dez 2012
107 Beiträge
 
Delphi 3 Professional
 
#5

AW: Wie geht das: JSON Parser

  Alt 24. Mär 2023, 15:04
Delphi-Quellcode:
  // ist überhaupt was im Array?
  if jArray.Count>0 then begin
    obj:=jArray.Items[0] as TJSONobject
    [... hier dann was mit dem obj machen ...]
  end;

  // oder alle Elemente durchgehen...
  for var i:=0 to jArray.Count-1 do begin
     [... mit jedem Item irgendwas machen ...]
  end;
Das sollte vielleicht nochmal einen Ansatz liefern, um etwas mehr mit dem Zeug arbeiten zu können.
Danke. Wenn ich das richtig verstanden habe, liefert dieser Ansatz die Länge des Haupt-Arrays. Ich benötige aber die Länge der zahlreichen Sub-Arrays.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wie geht das: JSON Parser

  Alt 24. Mär 2023, 16:51
Naja, in deinem Beispiel sieht man keine Sub-Arrays. Aber eigentlich solltest du jetzt schon alles beisammen haben, um auch an die Sub-Arrays zu kommen. Ein Beispiel aber noch:

Code:
[
  {
    "id": 799,
    "name": "Ship Your Idea",
    "slug": "ship-your-idea-22",
    "wuppdi": [
                {
                   "name": "horst",
                   "id": 1
                },
                {
                   "name": "klaus",
                   "id": 2
                }
             ]
  }
]
Hier hast du also in "wuppdi" ein Unter-Array.

Um darauf zuzugreifen, könnte man den vorigen Code so erweitern:

Delphi-Quellcode:
  Var
    jValue :TJSONValue;
    jArray: TJSONArray;
    subValue: TJSONValue;
    subArray: TJSONArray;
    Obj: TJsonObject;


  RESTRequest1.Execute;
  jValue := RESTResponse1.JSONValue;
  
  // Im Memo steht nun die JSON Antwort, so wie ich sie erwarte.
  Memo1.Text := jValue.ToString;

  jArray := RESTResponse1.JSONValue as TJSONArray;

  // ist überhaupt was im Array?
  if jArray.Count>0 then begin
    obj:=jArray.Items[0] as TJSONobject;
    subValue:=obj.GetValue('wuppdi');
    if subValue<>nil then begin
      subArray:=subValue as TJSONArray;
      if subArray.Count>0 then begin
        [... hier dann etwas mit dem Sub-Array machen ...]
      end;
    end;
    
    [... hier dann was mit dem obj machen ...]
  end;

  // oder alle Elemente durchgehen...
  for var i:=0 to jArray.Count-1 do begin
     [... mit jedem Item irgendwas machen ...]
  end;
Ich schätze, jetzt sollte das Grundprinzip so halbwegs klar sein.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#7

AW: Wie geht das: JSON Parser

  Alt 24. Mär 2023, 17:41
Ich möchte eine JSON-Antwort aus Wordpress komfortablel zerlegen.
Ist die entsprechende API irgendwo beschrieben?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#8

AW: Wie geht das: JSON Parser

  Alt 24. Mär 2023, 18:21
https://developer.wordpress.org/rest-api/
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
wurzelsepp1

Registriert seit: 9. Dez 2012
107 Beiträge
 
Delphi 3 Professional
 
#9

AW: Wie geht das: JSON Parser

  Alt 24. Mär 2023, 19:12
[QUOTE=Ich schätze, jetzt sollte das Grundprinzip so halbwegs klar sein. [/QUOTE]

Ja, jetzt hab ich alles. Vielen Dank.

Ich dachte, dass die von mir für die Subarrays verwendete Mechanik aObj.Items[0].GetValue<string>('images[0].name') vielleicht auch eine "Count" Möglichkeit hat. Daher die Frage.
  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 01:06 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