Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi JSON einlesen - Hilfe für Anfänger (https://www.delphipraxis.net/209555-json-einlesen-hilfe-fuer-anfaenger.html)

TERWI 20. Dez 2021 19:30

JSON einlesen - Hilfe für Anfänger
 
... 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 ?

freimatz 21. Dez 2021 06:47

AW: JSON einlesen - Hilfe für Anfänger
 
Google mal nach "delphi json reader example"

TERWI 21. Dez 2021 10:28

AW: JSON einlesen - Hilfe für Anfänger
 
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ß.

DeddyH 21. Dez 2021 10:43

AW: JSON einlesen - Hilfe für Anfänger
 
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.

Aviator 21. Dez 2021 10:59

AW: JSON einlesen - Hilfe für Anfänger
 
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
Delphi-Quellcode:
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
Delphi-Quellcode:
Foo
"ansprechen" soll obwohl sie
Delphi-Quellcode:
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;

mytbo 21. Dez 2021 11:02

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

Zitat von TERWI (Beitrag 1499446)
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

TERWI 21. Dez 2021 11:27

AW: JSON einlesen - Hilfe für Anfänger
 
... 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 ?!

Aviator 21. Dez 2021 12:44

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

Zitat von TERWI (Beitrag 1499452)
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.

TERWI 21. Dez 2021 12:55

AW: JSON einlesen - Hilfe für Anfänger
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

TiGü 21. Dez 2021 13:13

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

Zitat von TERWI (Beitrag 1499460)
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).


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr.
Seite 1 von 4  1 23     Letzte »    

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