AGB  ·  Datenschutz  ·  Impressum  







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

Anzahl Einträge in JsonArray

Ein Thema von rotwildmarcy · begonnen am 19. Sep 2024 · letzter Beitrag vom 26. Sep 2024
Antwort Antwort
rotwildmarcy

Registriert seit: 14. Feb 2007
25 Beiträge
 
#1

AW: Anzahl Einträge in JsonArray

  Alt 20. Sep 2024, 07:15
Erstmal sorry für den vergessenen Code Tag - Ich bin hier nicht so oft unterwegs, und den hab ich tatsächlich verpennt.

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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#2

AW: Anzahl Einträge in JsonArray

  Alt 20. Sep 2024, 07:59
Dann liegt der Verdacht nahe, dass Dein JSONArray überhaupt nicht initialisiert ist. Wenn Du vor der Schleife ein
Delphi-Quellcode:
//Vor dem Zugriff erst einmal prüfen
if Assigned(JSONArray) then
einfügst, kommt dann immer noch eine Zugriffsverletzung? Kommst Du trotzdem in die Schleife(Haltepunkt im Debugger setzen)?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
rotwildmarcy

Registriert seit: 14. Feb 2007
25 Beiträge
 
#3

AW: Anzahl Einträge in JsonArray

  Alt 20. Sep 2024, 08:21
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#4

AW: Anzahl Einträge in JsonArray

  Alt 20. Sep 2024, 08:36
Kannst Du das Array mal hier posten?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Anzahl Einträge in JsonArray

  Alt 20. Sep 2024, 08:50
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:
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;
Was fällt dir auf?


Delphi-Quellcode:
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;
Tipp: Füge mal ein ReportMemoryLeaksOnShutdown := True; in deine DPR oder ins OnCreate deiner Form ein.




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
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (20. Sep 2024 um 09:04 Uhr)
  Mit Zitat antworten Zitat
rotwildmarcy

Registriert seit: 14. Feb 2007
25 Beiträge
 
#6

AW: Anzahl Einträge in JsonArray

  Alt 20. Sep 2024, 08:53
Kannst Du das Array mal hier posten?
Das enthält leider viele sensible Daten.
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..
Angehängte Grafiken
Dateityp: png Screenshot 2024-09-20 094602.png (13,2 KB, 21x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Anzahl Einträge in JsonArray

  Alt 20. Sep 2024, 09:00
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:
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.
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.340 Beiträge
 
Delphi 12 Athens
 
#8

AW: Anzahl Einträge in JsonArray

  Alt 20. Sep 2024, 09:08
Damit erzeugt der Zugriff auf das 10te Element eine Zugriffsverletzung. Die Schleife darf also nur bis Count - 1 gehen.
Müsste aber eine EArgumentOutOfRangeException sein.

TJSONArray.GetValue -> TList<T>.GetItem -> CheckItemRange -> ErrorArgumentOutOfRange -> raise EArgumentOutOfRangeException

Ohhh, steht so sogar in der Doku drin.
Zitat:
Delphi-Quellcode:
    /// <summary> Returns the array element. Raises EArgumentOutOfRangeException exception if index is out of range </summary>
    /// <param name="Index">- element index</param>
    /// <returns>JSONValue element</returns>
    property Items[const Index: Integer]: TJSONValue read GetValue; default;

Wie gesagt, siehe #3 und #8 .... ich tippe auf das zu kurze IF, bzw. das dahinter


Zitat:
Das wirft mir aber eime Zugriffsverletzung aus.
Oder dieser Text ist gelogen falsch wiedergegeben.

Du wirst es nicht glauben, aber Strg+C funktioniert bei fast allen Dialog-Fenstern, sowie im Logfenster des Delphi,
und dann hier in einem [QUOTE] ein Strg+V.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (20. Sep 2024 um 09:14 Uhr)
  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 12:55 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