![]() |
AW: JSON einlesen - Hilfe für Anfänger
@TiGü
...irgendwie ist das doch das gleiche wie in meinem Post #27, nur etwas anders mit mehr Info. Was ist schneller als was ? Uwe's Version oder die von jobo oder TiGü... 'per Json-Hand filetiert' ... Geschwindigkeit ist bei mir bei den eher kleinen Datenmengen (< 1MByte) nicht so die Wichtgkeit. Ich lege Wert drauf, dass ich das verstanden habe was ich/andere da geproggt haben und für mich auch später bei Bedarf modifizieren kann. |
AW: JSON einlesen - Hilfe für Anfänger
Ich hatte etwas Muße das nochmal detaillierter zu betrachten. Herausgekommen ist dabei eine hybride Lösung:
Delphi-Quellcode:
Aufgerufen wird das dann so:
unit TestJSON1Unit1;
interface uses System.SysUtils, System.Classes, System.Generics.Collections, REST.JSON.Types, REST.Json, System.JSON; type TEPGInfo = class private FId: Integer; [JSONName('t')] FTitle: string; [JSONName('et')] FEpisode_Title: string; [JSONName('g')] FGenre: TArray<string>; public property Id: Integer read FId; property Title: string read FTitle; property Episode_Title: string read FEpisode_Title; property Genre: TArray<string> read FGenre; end; type TChannel = class(TObjectList<TEPGInfo>) private FName: string; public property Name: string read FName write FName; end; TChannels = class(TObjectDictionary<string, TChannel>); procedure LoadChannels(const AJson: string; Target: TChannels; const AChannels: TArray<string> = nil); implementation uses System.StrUtils; procedure LoadChannels(const AJson: string; Target: TChannels; const AChannels: TArray<string> = nil); var channel: TChannel; channelName: string; item: TJSONValue; jsonObj: TJSONObject; jsonValue: TJSONValue; pair: TJSONPair; begin jsonValue := TJSONObject.ParseJSONValue(AJson); try jsonObj := (jsonValue as TJSONObject).Values['channels'] as TJSONObject; for pair in jsonObj do begin channelName := pair.JsonString.Value; if (Length(AChannels) > 0) and not MatchText(channelName, AChannels) then Continue; channel := TChannel.Create; channel.Name := channelName; for item in (pair.JsonValue as TJSONArray) do channel.Add(TJson.JsonToObject<TEPGInfo>(item as TJSONObject)); Target.Add(channel.Name, channel); end; finally jsonValue.Free; end; end; end.
Delphi-Quellcode:
Sollten weitere EPG-Felder benötigt werden, reicht es diese in der Klasse TEPGInfo entsprechend zu ergänzen.
program TestJSON1;
{$APPTYPE CONSOLE} uses System.SysUtils, System.IOUtils, System.Generics.Collections, TestJSON1Unit1 in 'TestJSON1Unit1.pas'; procedure ListChannels(Channels: TChannels); { Sender auflisten } var arr: TArray<string>; S: string; begin arr := Channels.Keys.ToArray; TArray.Sort<string>(arr); for S in arr do Writeln(S); end; procedure ListProgram(Channels: TChannels; const AName: string); { Programm auflisten } var channel: TChannel; info: TEPGInfo; begin channel := Channels[AName]; if channel <> nil then begin Writeln(channel.Name); for info in channel do Writeln(Format('%d: %s - %s (%s)', [info.Id, info.title, info.Episode_Title, string.Join(',', info.Genre)])); end; end; procedure ParseJson(); var arr: TArray<string>; channel: TChannel; channels: TChannels; FileContent: string; info: TEPGInfo; S: string; begin FileContent := TFile.ReadAllText('c:\Users\Uwe\Downloads\EPG_GUIDE\EPG_GUIDE.json'); channels := TChannels.Create; try LoadChannels(FileContent, channels, ['ard', 'zdf']); ListChannels(channels); ListProgram(channels, 'ard'); ListProgram(channels, 'zdf'); finally channels.Free; end; end; begin try ParseJson; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Write('press enter...'); Readln; end. |
AW: JSON einlesen - Hilfe für Anfänger
Danke dir, Uwe. Das werde ich zeitnah mal testen.
Da fehlen logo noch etliche Daten in TEPGInfo. Die Klasse erweitern ist sicher nicht das Problem, aber .... Die Daten (erweiterte EPG-Texte/Beschreibungen) kommen aus einer 2ten Datei separat je Sender zu laden. Funzt das im Prinzip genauso ? Dito die Logo's zum Sender und 'Live-Pics" vom Programm, welche sich 'im Zeitraffer' (alle 15 Sekunden ?!) ändern und ggf. nachzuladen wäre (nur prinzipiell...) |
AW: JSON einlesen - Hilfe für Anfänger
Zitat:
|
AW: JSON einlesen - Hilfe für Anfänger
@TiGü, Uwe
Ich hab mir das hier zum Testen mal zusammengelaubt, nur um den Sendungsnamen zu lesen:
Delphi-Quellcode:
Das kompiliert, funzt 1A und ist recht fix .... aber:
jsonObj := jsonobj.Values['channels'] as TJSONObject;
for jsonpair in jsonObj do begin ZATEPG.Log('UPDEPG', Format('Channel: %s',[jsonpair.JsonString.Value])); for item in (jsonpair.JsonValue as TJSONArray) do begin s := (item as TJSONObject).GetValue('t').Value; // <- FEHLER ??? ZATEPG.Log('UPDEPG', ' - ' + s); end; end; Delphi meckert rum: -> Undeklarierter Bezeichner 'Value' in Zeile .... Warum ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 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