Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
Delphi 10.4 Sydney
|
AW: JSON einlesen - Hilfe für Anfänger
22. Dez 2021, 13:29
Ausgehend von Uwes Konsolenprogramm und den richtigen Daten aus #9 aus dem Archiv schnell was zusammengezimmert.
Meiner Meinung nach scheidet der Ansatz wegen der Verwendung der Sendernamen als Schlüssel eigentlich aus. Man könnte vermutlich einen Interceptor schreiben, der das sinnvoll auflöst, aber das wäre zu viel Aufwand.
Ja, daher hier nochmal die Version zu Fuß (sollte dadurch auch schneller sein?):
Delphi-Quellcode:
procedure ParseJsonTERWI;
var
JsonRoot, JsonChannels, JsonEPGInfo: TJSONObject;
JsonEPGInfos, JsonEPGDetailInfoArray: TJSONArray;
JsonValue, JsonValue2, JsonSingleChannel: TJSonValue;
JsonPair, JsonPair2: TJSONPair;
I, N, J: integer;
FileContent, ProgramName: string;
begin
FileContent := TFile.ReadAllText('EPG_GUIDE.json');
JsonRoot := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(FileContent), 0) as TJSONObject;
try
JsonValue := JsonRoot.Get('channels').JsonValue;
if JsonValue is TJSONObject then
begin
JsonChannels := TJSONObject(JsonValue);
Writeln('Es gibt soviele Kanäle: ', JsonChannels.Count);
Writeln('Enter-Taste drücken...');
Readln;
Writeln(sLineBreak + 'Auflistung der Kanäle...');
N := 1;
for JsonPair in JsonChannels do
begin
ProgramName := JsonPair.JsonString.Value;
Writeln(N.ToString + '. ', ProgramName);
Inc(N);
end;
Writeln(sLineBreak + 'EPG-Informationen der ersten 3 Sender...');
Writeln('Enter-Taste drücken...');
Readln;
N := 1;
for JsonPair in JsonChannels do
begin
if JsonPair.JsonValue is TJSONArray then
begin
JsonEPGInfos := TJSONArray(JsonPair.JsonValue);
Writeln(sLineBreak + N.ToString + '. ', ProgramName + ' hat soviele EPG-Informationen: ', JsonEPGInfos.Count);
for I := 0 to JsonEPGInfos.Count - 1 do
begin
JsonValue2 := JsonEPGInfos.Items[I];
if JsonValue2 is TJSONObject then
begin
JsonEPGInfo := TJsonObject(JsonValue2);
Writeln('...die EPG-Information hat soviele Einträge: ', JsonEPGInfo.Count);
for JsonPair2 in JsonEPGInfo do
begin
// das hier wäre die Stelle wo du aus JsonPair2.JsonValue dir die nötigen Informationen
// für deine Klassenstruktur/Liste/EPG-Guide zusammenpuzzeln musst.
Writeln('......', JsonPair2.JsonString.Value, ': ', JsonPair2.JsonValue.ToString);
// Wenn JsonPair2.JsonValue ein Array ist (z.B. Genres), dann hier nochmal genauer reingucken:
if JsonPair2.JsonValue is TJSONArray then
begin
JsonEPGDetailInfoArray := TJSONArray(JsonPair2.JsonValue);
for J := 0 to JsonEPGDetailInfoArray.Count - 1 do
begin
Writeln('.........', JsonEPGDetailInfoArray.Items[J].Value);
end;
end;
end;
end;
end;
end;
Inc(N);
if N = 3 then
begin
Writeln(sLineBreak + 'Damit es nicht zuviel wird, brechen wir hier nach 3 Sendern ab!');
Break;
end;
end;
// Beispiel für einzelnen Sender -> hier dann wie oben auswerten!
JsonSingleChannel := JsonChannels.GetValue('ard');
if JsonSingleChannel is TJSONArray then
begin
JsonEPGInfos := TJSONArray(JsonSingleChannel);
// usw. usf.
end;
end;
Writeln('Enter-Taste drücken...');
Readln;
finally
JsonRoot.Free;
end;
end;
|
|
Zitat
|