Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

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 22. Dez 2021 20:40

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.

Uwe Raabe 23. Dez 2021 11:19

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:
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.
Aufgerufen wird das dann so:
Delphi-Quellcode:
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.
Sollten weitere EPG-Felder benötigt werden, reicht es diese in der Klasse TEPGInfo entsprechend zu ergänzen.

TERWI 24. Dez 2021 15:17

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...)

Uwe Raabe 24. Dez 2021 15:58

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

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

Kann ich so nicht beurteilen. Dazu müsste man diese Dateien mal sehen.

TERWI 7. Jan 2022 21:43

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:
    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;
Das kompiliert, funzt 1A und ist recht fix .... aber:
Delphi meckert rum:
-> Undeklarierter Bezeichner 'Value' in Zeile ....

Warum ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 Uhr.
Seite 4 von 4   « Erste     234   

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