Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Wie geht das: JSON Parser (https://www.delphipraxis.net/212740-wie-geht-das-json-parser.html)

wurzelsepp1 24. Mär 2023 12:03

Wie geht das: JSON Parser
 
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

Bbommel 24. Mär 2023 12:10

AW: Wie geht das: JSON Parser
 
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
Delphi-Quellcode:
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.

wurzelsepp1 24. Mär 2023 13:51

AW: Wie geht das: JSON Parser
 
Zitat:

Zitat von Bbommel (Beitrag 1520274)
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
Delphi-Quellcode:
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:

Delphi-Quellcode:
  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.

Bbommel 24. Mär 2023 14:00

AW: Wie geht das: JSON Parser
 
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. :-)

wurzelsepp1 24. Mär 2023 14:04

AW: Wie geht das: JSON Parser
 
Zitat:

Zitat von Bbommel (Beitrag 1520278)
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.

Bbommel 24. Mär 2023 15:51

AW: Wie geht das: JSON Parser
 
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. :-)

Uwe Raabe 24. Mär 2023 16:41

AW: Wie geht das: JSON Parser
 
Zitat:

Zitat von wurzelsepp1 (Beitrag 1520273)
Ich möchte eine JSON-Antwort aus Wordpress komfortablel zerlegen.

Ist die entsprechende API irgendwo beschrieben?

himitsu 24. Mär 2023 17:21

AW: Wie geht das: JSON Parser
 
https://developer.wordpress.org/rest-api/

wurzelsepp1 24. Mär 2023 18:12

AW: Wie geht das: JSON Parser
 
[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
Delphi-Quellcode:
aObj.Items[0].GetValue<string>('images[0].name')
vielleicht auch eine "Count" Möglichkeit hat. Daher die Frage.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz