![]() |
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:
Wie lese ich das gescheit & einfach in Schleife mit TJSONObject, TJSONArray, TJSONValue, .... aus ?
{"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 ... } ], } } |
AW: JSON einlesen - Hilfe für Anfänger
Google mal nach "delphi json reader example"
|
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ß. |
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. |
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:
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.
Blöcke
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:
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
{
"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 ] } ] }
Delphi-Quellcode:
"ansprechen" soll obwohl sie
Foo
Delphi-Quellcode:
heißen.
Bar
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; |
AW: JSON einlesen - Hilfe für Anfänger
Zitat:
![]() 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 ![]() ![]() ![]() Bis bald... Thomas |
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 ?! |
AW: JSON einlesen - Hilfe für Anfänger
Zitat:
|
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. |
AW: JSON einlesen - Hilfe für Anfänger
Zitat:
![]() 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 05:25 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 by Thomas Breitkreuz