AGB  ·  Datenschutz  ·  Impressum  







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

JSON einlesen - Hilfe für Anfänger

Ein Thema von TERWI · begonnen am 20. Dez 2021 · letzter Beitrag vom 7. Jan 2022
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#1

JSON einlesen - Hilfe für Anfänger

  Alt 20. Dez 2021, 20:30
... eine absoluter JSON-Laie braucht Hilfe:
Wie lese ich einfach und schnell Daten mit folgendem Aufbau ein ?
Hab bisher mit JSON noch nix gemacht.
Die Reihenfolge der Daten in den Blöcken kann je nach Quelle unterschiedlich sein.
Speichern will ich das ganze in einer TList aus Records
Code:
{"Blöcke":
  {"Block_A":
    [{"Liste_1":[],
      "Liste_2":["Text_A"],
      "Int_1":111,
      "Txt_1":"Bla...",
      "Txt_2":"..Bla",
      "Int_2":2222,
      "Bool_1":true,
      "Liste_3":["Text_B","Text_C"],
      "Real_1":123,4,
      "Wert":null,
      "Bool_2":false,
      "Liste_4":[1,3,5,7]
     },
    ],
   "Block_B":
    [{... wie Block_A ...
     }
    ],
   ....
   "Block_Z":
    [{... wie Block_A ...
     }
    ],
  }
}
Wie lese ich das gescheit & einfach in Schleife mit TJSONObject, TJSONArray, TJSONValue, .... aus ?
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.447 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: JSON einlesen - Hilfe für Anfänger

  Alt 21. Dez 2021, 07:47
Google mal nach "delphi json reader example"
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: JSON einlesen - Hilfe für Anfänger

  Alt 21. Dez 2021, 11:28
Na logo habe ich auch schon rumgekugelt... aber finde nirgends was für Dummies, die das erste mal damit hantieren.
Zudem sehen die JSON-Daten in den Beispielen alle irgendwie anders aus (auch von den Klammerstellungen).

"Blöcke" wird hier wohl das ganze Array heissen, gibt's nur 1x im Kopf.
"Block_A" bis "Block_Z" sind die jeweiligen Namen der Array-Einträge ?!

Diese Namen kenne ich nicht und muss danach suchen, bzw. beim Durchlaufen auswerten - dazu hab ich nix gefunden.
Die Reihenfolge und Anzahl ist dazu auch beliebig.
Der Name ist aber wichtig, da ich den zum einen als Erkennung ob vorhanden benötige und mit dem Namen dann auch in meiner Liste entsprechend die Werte speichern will.

Jeder Block für sich hat dann aber wieder eine fixe Anzahl von Werten, dessen Typ und Namen ich auch kenne.
(Liste_x, Int_x, Bool_x, ...)
Und wie erkenne ich, wie viele Einträge eine Werte-Liste aus Strings oder Integern hat ? (siehe Liste_3 und Liste_4).

Ich bräuchte für den AHA-Effekt mal einen rudimentären Denkanstoß.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: JSON einlesen - Hilfe für Anfänger

  Alt 21. Dez 2021, 11:43
Du hast ein JSON-Objekt mit einem Feld "Blöcke", was wiederum ein JSON-Objekt ist. Dieses hat dann die Felder "Block_A" bis "Block_Z". Jedes dieser Block-Felder ist ein JSON-Array, bestehend aus JSON-Objekten. Diese JSON-Objekte wiederum weisen die folgenden Felder auf:
- Liste_1: JSON-Array (Datentyp nicht ersichtlich)
- Liste_2: JSON-Array vom Typ String
- Int_1: Integer
- Txt_1: String
- Int_2: Integer
- Bool_1: Boolean
- Liste_3: JSON-Array vom Typ String
- Real_1: soll wohl Single oder Double sein, Notation ist aber falsch (Punkt statt Komma als Dezimaltrenner verwenden, TJSONNumber in Delphi)
- Wert: unbekannter Datentyp, da TJSONNull im Beispiel
- Bool_2: Boolean
- Liste_4: JSON-Array vom Typ Integer

Ich hoffe, das hilft Dir schon einmal etwas weiter.
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
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: JSON einlesen - Hilfe für Anfänger

  Alt 21. Dez 2021, 11:59
Ich habe mal einen schemenhaften Aufbau gemacht. Die JSON Datei war vmtl. sowieso nur ein Beispiel von dir. Allerdings ist auch der Aufbau darin merkwürdig und manche Dinge machen auch gar keinen Sinn.

Beispielsweise ist Blöcke ein Objekt, das wiederum einzelne Properties hat die ein Array sind, aber nur ein Objekt beinhalten. Ich glaube, dass der Aufbau falsch herum ist. Das solltest du bei deinen Beispielen beachten. Ansonsten kann es schwierig werden zu helfen.

Ausgehend von folgendem JSON String habe ich jetzt mal eine kleine Mini-Procedure gebaut die dir helfen sollte den JSON String in ein Objekt umzuwandeln. Du musst das natürlich noch auf deine Bedürfnisse anpassen.

Disclaimer: Der Code ist nur so im Editor getippt. Also keine Gewähr auf 100%ige Funktionsfähigkeit.

Code:
{
    "Blöcke": [
        {
            "Liste_1": [
                "Text_A"
            ],
            "Int_1": 111,
            "Txt_1": "Bla...",
            "Bool_1": true,
            "Real_1": 123.4,
            "Liste_4": [
                1,
                3,
                5,
                7
            ]
        },
        {
            "Liste_1": [
                "Text_A"
            ],
            "Int_1": 111,
            "Txt_1": "Bla...",
            "Bool_1": true,
            "Real_1": 123.4,
            "Liste_4": [
                1,
                3,
                5,
                7
            ]
        }
    ]
}
Wichtig bei dem Delphi JSON Parser ist, dass die Felder mit dem Buchstaben F anfangen. Ansonsten findet der Parser diese nicht und ignoriert sie. Die Felder müssen zudem genau so benannt werden wie sie in der JSON Datei auch lauten. Solltest du sie anders benennen wollen, gibt es gewisse Attribute die du zu den Felder zuweisen kannst. Dann weiß der Parser, dass er sie mit dem Namen Foo "ansprechen" soll obwohl sie Bar heißen.

Delphi-Quellcode:
type
  TBlock = class
  private
    FListe1: TArray<string>;
    FListe4: TArray<Integer>;
    FInt_1: Integer;
    FTxt_1: string;
    FBool_1: Boolean;
    FReal_1: Real;
  public
    property Liste1: TArray<string> read FListe1 write FListe1;
    property Liste4: TArray<Integer> read FListe4 write FListe4;
    property Int_1: Integer read FInt_1 write FInt_1;
    property Txt_1: string read FTxt_1 write FTxt_1;
    property Bool_1: Boolean read FBool_1 write FBool_1;
    property Real_1: Real read FReal_1 write FReal_1;
  end;

  TBlocks = TArray<TBlock>;

procedure ParseJson();
var
  FileContent: String;
  Blocks: TBlocks;
begin
  FileContent := TFile.ReadAllText('path\to\file.json');
  Blocks := TJson.JsonToObject<TBlocks>(FileContent);
end;
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#6

AW: JSON einlesen - Hilfe für Anfänger

  Alt 21. Dez 2021, 12:02
Zudem sehen die JSON-Daten in den Beispielen alle irgendwie anders aus (auch von den Klammerstellungen).
Wie dir schon selbst aufgefallen ist, sieht die gegebene JSON Struktur "gewöhnungsbedürftig" aus. Für deinen beschriebenen Fall bietet sich förmlich mORMot an. Meiner Meinung nach eine der besten und mächtigsten Libraries in der Delphi Welt. Ich würde das Ganze in eine DocVariant Struktur laden. Dann kannst du alles ohne große Probleme in kleine Happen zerlegen.

mORMot ist von D7 bis 11 verfügbar. Es reicht aus, die entsprechenden Bibliothekspfade einzufügen. Die eigentliche Arbeit ist mit mORMot oft schnell erledigt, das Problem dürfte sein, dich in mORMot einzuarbeiten. Es steht eine ausführliche Hilfe, viele Beispiele und ein freundliches Forum zur Verfügung. Hier findest du den Download.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: JSON einlesen - Hilfe für Anfänger

  Alt 21. Dez 2021, 12:27
... das ist mir auch schon klar, hatte ich ja auch in etwa so geschrieben.
Die Quizfrage ist nur: Wie komm ich an die Daten & Namen in einer Schleife und Wie frage ich die Werte-Arrays im Array-Eintrag ab / prüfe die ?
Mit Denkanstoß mente ich ein paar hilfreiche Zeilen Code.


OOops - da hat sich was überschnitten.

Merkwürdig ?
Nein, die Daten sehen vom Format / Klammerstellung ( {} und [] ) exakt so aus ! Ich habe nur die Namen und ANzahl der Felder geändert / gekürzt.
Ich kann's ja ruhig sagen: Das ist eine Abfrage bei ZATTO-IPTV für die elementaren EPG-Daten. Kanal-Liste sieht ähnlich aus.
Ich könnte ja mal eine Datei anhängen ?!

Geändert von TERWI (21. Dez 2021 um 13:20 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: JSON einlesen - Hilfe für Anfänger

  Alt 21. Dez 2021, 13:44
Ich könnte ja mal eine Datei anhängen ?!
Kannst du machen. Dann sehen wir zumindest mal den Aufbau. Aber du solltest mit ein bisschen Eigeninitiative mit den bereits gegebenen Antworten selbst was aufbauen können.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: JSON einlesen - Hilfe für Anfänger

  Alt 21. Dez 2021, 13:55
Hier mal eine Testdatei mit Daten für 3 Stunden EPG.
Musste ich packen, weil zu groß.

Edith:
Lt. div. JSON-Validatoren im Netz sind die Daten gültig.
Ich bekomme auch eine hübsche Baumansicht.
Wenn es denn doch (merkwürdiges) Standard-JSON ist, sollte man das doch auch mit Bordmitteln auswerten können...

@Aviator
Meine Versuche bisher mit Copy6Paste aus dem Netz angepasst funktionieren nicht.
Angehängte Dateien
Dateityp: rar EPG_GUIDE.rar (22,6 KB, 17x aufgerufen)

Geändert von TERWI (21. Dez 2021 um 14:10 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: JSON einlesen - Hilfe für Anfänger

  Alt 21. Dez 2021, 14:13
Hier mal eine Testdatei mit Daten für 3 Stunden EPG.
Musste ich packen, weil zu groß.
Schau doch mal hier: https://edn.embarcadero.com/article/40882

Dieser 10 Jahre alte JSON-Parser und Viewer kann deine Datei verarbeiten.
Inzwischen haben sich ein paar Unit-Namen geändert, aber sonst passt es.
Vielleicht kannst du dir was abgucken.

Ansonsten hast du mit den Hinweisen hier, unzähligen Beispiel in der DP, auf DocWiki, Stack Overflow oder GitHub eigentlich alles was du brauchst.

Hilfreich ist immer eine Baumansicht auf die Daten, wenn man sich den Parsing-Quelltext mit der Hand zusammenstellt.
Ich empfehle hier Notepad++.
Da kann man sich bequem Plugins dazu laden, die das können (JSON Viewer in Version 1.34 oder JSTool in Version 1.2001.1).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 16:23 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