![]() |
Anzahl Einträge in JsonArray
Guten Abend,
ich muss für einen Schleifendurchlauf die Anzahl Einträge im JsonArray wissen. Ich dachte, da käme man mit JsonArray.Count dran. Das wirft mir aber eime Zugriffsverletzung aus.
Delphi-Quellcode:
Danke vorab für eine Tip in die richtige Richtung.
For i := 0 to JSonArray.Count do
Begin JSonObject := TJSonObject.Create; JsonValue:=JSonObject.ParseJSONValue(st); if (JSONValue is TJSONArray) then id := ((JSONValue as TJSONArray).Items[i] as TJSonObject).Get('id').JSONValue.Value; name := ((JSONValue as TJSONArray).Items[i] as TJSonObject).Get('name').JSONValue.Value; stringgrid1.Cells[1,j] := id; |
AW: Anzahl Einträge in JsonArray
Nimm doch mal den Debugger. Dann wirst du sehen, dass er einige Male durch die Schleife kommt. Vielleicht auch mal mit "Count -1" probieren, da das Array in der Regel mit 0 anfängt und wenn bis Count iteriert wird, dann ist es einmal zuviel.
|
AW: Anzahl Einträge in JsonArray
Nicht nur "vielleicht"!
Aber das wird wohl nicht der Fehler sein, denn dort kommt ein Index-Fehler (OutOfRange, bzw. genauer eine EArgumentOutOfRangeException). Viel eher würde ich auf das Get vom TJsonObject tippen, denn das liefert NIL, wenn es kein SubObjekt mit diesem Namen (id oder name) gibt, und demnach muß es im JSONValue knallen, weil DU die Rückgabe vorher nicht prüfst. Und ich vermute mal stark, da sollte ein BEGIN END; hinterm
Delphi-Quellcode:
vorkommen? :!:
if (JSONValue is TJSONArray) then
Alles Dinge, die man beim Debuggen leicht bemerken könnte. Ach ja, ParseJSONValue ist eine Class-Function, welche man normaler Weise als
Delphi-Quellcode:
aufruft.
TJSONValue.ParseJSONValue(...)
Zitat:
Delphi-Quellcode:
JsonValue := TJSONValue.ParseJSONValue(st);
Also das JsonObject ist unnötig. (auch wenn es zum Glück kein "Fehler" ist) Und ich hoffe du gibst am Ende auch alles wieder brav frei. (Free) Da es aber grad zufällig so wunderschön bei dir knallt ... Wäre super, wenn man mehr Ressorcen-Schutzblöcke (try finally) sehen würde. PS: Den Knopf mit dem Delphi-Helm hattest du nicht zufällig bemerkt? [delphi] dein Code [/delphi] |
AW: Anzahl Einträge in JsonArray
Erstmal sorry für den vergessenen Code Tag - Ich bin hier nicht so oft unterwegs, und den hab ich tatsächlich verpennt.:wall:
Ich bin noch blutiger Anfänger, gerade was die Json Nummer betrifft. Mir ist das leider immer noch nicht klar. Sollte denn JSonArray.Count nicht eigentlich eine Zahl auswerfen, jetzt ganz unabhängig von möglichen Fehlern in der Schleife? Wenn ich mir das vor der Schleife, zb. mit Showmessage anzeigen lassen, kriege ich auch die Zugriffsverletzung. |
AW: Anzahl Einträge in JsonArray
Dann liegt der Verdacht nahe, dass Dein JSONArray überhaupt nicht initialisiert ist. Wenn Du vor der Schleife ein
Delphi-Quellcode:
einfügst, kommt dann immer noch eine Zugriffsverletzung? Kommst Du trotzdem in die Schleife(Haltepunkt im Debugger setzen)?
//Vor dem Zugriff erst einmal prüfen
if Assigned(JSONArray) then |
AW: Anzahl Einträge in JsonArray
Er kommt dann bis zu Schleife und gibt die Zugriffsverletzung.
Wenn ich die Schleife komplett auskommentiere, geht die Anzeige von JsonArray.Count jetzt aber mit dem If Assigned Der ausgeworfene Wert stimmt allerdings nicht. Es wird immer die 48 ausgeworfen, egal wieviel Einträge es tatsächlich sind. |
AW: Anzahl Einträge in JsonArray
Kannst Du das Array mal hier posten?
|
AW: Anzahl Einträge in JsonArray
Delphi-Quellcode:
for i := 0 to JSonArray.Count - 1 do
begin JsonValue := TJsonValue.ParseJSONValue(st); if (JSONValue is TJSONArray) then id := ((JSONValue as TJSONArray).Items[i] as TJSonObject).Get('id').JSONValue.Value; name := ((JSONValue as TJSONArray).Items[i] as TJSonObject).Get('name').JSONValue.Value; stringgrid1.Cells[1,j] := id;
Delphi-Quellcode:
Was fällt dir auf?
for i := 0 to JSonArray.Count - 1 do
begin JsonValue := TJsonValue.ParseJSONValue(st); if (JSONValue is TJSONArray) then begin id := ((JSONValue as TJSONArray).Items[i] as TJSonObject).Get('id').JSONValue.Value; name := ((JSONValue as TJSONArray).Items[i] as TJSonObject).Get('name').JSONValue.Value; stringgrid1.Cells[1,j] := id; end;
Delphi-Quellcode:
Tipp: Füge mal ein
for i := 0 to JSonArray.Count - 1 do
begin JsonValue := TJsonValue.ParseJSONValue(st); try if (JSONValue is TJSONArray) then begin id := ((JSONValue as TJSONArray).Items[i] as TJSonObject).Get('id').JSONValue.Value; name := ((JSONValue as TJSONArray).Items[i] as TJSonObject).Get('name').JSONValue.Value; stringgrid1.Cells[1,j] := id; end; finally JsonValue.Free; end;
Delphi-Quellcode:
in deine DPR oder ins OnCreate deiner Form ein.
ReportMemoryLeaksOnShutdown := True;
Anzahl = Count Bereich = 0 bis Anzahl-1 oder 1 bis Anzahl 10 = 0 bis 9 (0 1 2 3 4 5 6 7 8 9 = 10 Zahlen) oder 10 = 1 bis 10 (1 2 3 4 5 6 7 8 9 10 = auch 10 Zahlen) wenn bei 1 begonnen wird zu zählen oder 10 = 99998 bis 100007 :angle2: |
AW: Anzahl Einträge in JsonArray
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Das Array ist aber auf jeden Fall in Ordnung. (Screenshot anbei) In diesem Fall sind es ja 10 Einträge. Wenn's zur Problemlösung hilfreich ist, könnte ich natürlich ein kleines Beispiel Array anlegen zum testen.. |
AW: Anzahl Einträge in JsonArray
Wie aus dem Screenshot zu ersehen, geht der Index der Array-Elemente von 0 bis 9. Deine Schleife geht aber von 0 bis Count (= 10). Damit erzeugt der Zugriff auf das 10te Element eine Zugriffsverletzung. Die Schleife darf also nur bis Count - 1 gehen.
Das wurde auch bereits im ersten Kommentar erwähnt: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:52 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