![]() |
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:
Könnte mir einer der JSON-Götter kurz sagen, was ich da falsch mache? ;-)
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); Btw: Die JSON-Daten sehen übrigens so aus (stark gekürzt):
Code:
Und eine Frage noch:
[
{ "id": 799, "name": "Ship Your Idea", "slug": "ship-your-idea-22", } ] 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 |
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:
machen und dann mit den Methoden des Arrays aus dem ersren Element dein Objekt fischen.
RESTResponse1.JSONValue as TJSONArray
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. |
AW: Wie geht das: JSON Parser
Zitat:
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:
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.
Memo1.Lines.Add('Bild ID: ' + aObj.Items[0].GetValue<string>('images[0].id') );
|
AW: Wie geht das: JSON Parser
Delphi-Quellcode:
Das sollte vielleicht nochmal einen Ansatz liefern, um etwas mehr mit dem Zeug arbeiten zu können. :-)
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; |
AW: Wie geht das: JSON Parser
Zitat:
|
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:
Hier hast du also in "wuppdi" ein Unter-Array.
[
{ "id": 799, "name": "Ship Your Idea", "slug": "ship-your-idea-22", "wuppdi": [ { "name": "horst", "id": 1 }, { "name": "klaus", "id": 2 } ] } ] Um darauf zuzugreifen, könnte man den vorigen Code so erweitern:
Delphi-Quellcode:
Ich schätze, jetzt sollte das Grundprinzip so halbwegs klar sein. :-)
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; |
AW: Wie geht das: JSON Parser
Zitat:
|
AW: Wie geht das: JSON Parser
|
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:
vielleicht auch eine "Count" Möglichkeit hat. Daher die Frage.
aObj.Items[0].GetValue<string>('images[0].name')
|
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