Einzelnen Beitrag anzeigen

venice2
(Gast)

n/a Beiträge
 
#1

Json parsen problem

  Alt 15. Dez 2020, 00:34
Habe ein kleines Problem beim parsen meiner Json.

Code:
   "channels": [
      {
         "programs": [
            {
               "i_url": "http://images.zattic.com/cms/3f240530cf1a3bad8f63/format_480x360.jpg",
               "e": 1607986200,
               "g": [],
Auf channels kann ich zugreifen aber auf programs nicht.

Delphi-Quellcode:
function TZATJSON.GetJSONByNameOrIndex(const AData: Variant): TZATJSON;
begin
  case VarType(AData) and VarTypeMask of
    varString, varUString, varWord, varLongWord:
      if not FItems.TryGetValue(AData, Result) then //>>> Result ist nil weil ich nicht die korrekte Reihenfolge einhalte beim parsen. Nur wie? Wenn ich nicht an programs dran komme.
        raise EJSONUnknownFieldOrIndex.Create(format('Unknown field: %s', [AData]))
      else
        exit;
Delphi-Quellcode:
procedure TEpgDataList.FillList(aZatJson: TZATJSON);
var
  lZatJson: TZATJSON;
begin

  if assigned(aZatJson) then
  begin
    lZatJson := aZatJson.JSONByNameOrIndex['channels'];

    if assigned(lZatJson) and lZatJson.IsList then
    begin
      if lZatJson.ListItems.Count > 0 then
        addEpgData(lZatJson.ListItems[0]);
    end;
  end;
end;
Delphi-Quellcode:
procedure TEpgDataList.addEpgData(aZatJson: TZATJSON);
var
  entry: TEpgData;
  Epgloop: tEpgEntries;
  ltemp: TZATJSON;
  lEntrienames: tEpgEntryNames;
begin

  if assigned(aZatJson) then
  begin
    // Set up temporary Data
    entry := System.default(TEpgData);

    lEntrienames := EntryEpgNames;

    begin
      for Epgloop := Low(tEpgEntries) to High(tEpgEntries) do
        // Check if there is a Name.......
        if lEntrienames[Epgloop] <> 'then
        begin
          ltemp := aZatJson[lEntrienames[Epgloop]]; //>>>>>>
>> hier kracht es

wenn ich versuche 'i_url' anzusprechen ohne vorher programs initialisiert zu haben
programs will nicht nach channels und 'i_url' kann ich nicht aufrufen da es ein unterknoten von programs ist.
rufe ich programs auf ohne channels dann kracht es auch.
Also so!
lZatJson := aZatJson.JSONByNameOrIndex['programs'];
wo ist mein Fehler?

Wie kann ich also programs ansprechen damit es gefunden wird.

EDIT:
addiere ich jetzt programs zu den items die in die liste addiert werden sollen dann wird es korrekt gelesen.
Aber die untergeordneten Items werden wieder nicht erkannt.
Delphi-Quellcode:
  EntryEpgNames: TEpgEntryNames = ('programs', 'i_url', 'e', 'g', 'ry_u', 'i', 'sr_u', 'c',
    'r_e', 'rg_u', 'e_no', 's', 't', 'ser_e', 'c_ids', 'success');
grrr....

Geändert von venice2 (16. Dez 2020 um 17:26 Uhr)
  Mit Zitat antworten Zitat