AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem bei JSON-Abfrage

Ein Thema von Maekkelrajter · begonnen am 20. Sep 2020 · letzter Beitrag vom 4. Nov 2020
 
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
125 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Problem bei JSON-Abfrage

  Alt 23. Sep 2020, 11:04
Seit ein paar Tagen versuche ich, eine Abfrage nach Uwe Raabes Vorschlag zu realisieren. Bei der Ausführung der ' GetPlaylistTracks' - Funktion allerdings flogen mir die AccessViolations nur so um die Ohren
Den 'Unfallort' konnte ich in der Procedure TJSONUnMarshal.PopulateFields in der Unit REST.JsonReflect ausmachen:
Delphi-Quellcode:
procedure TJSONUnMarshal.PopulateFields(JsonFields: TJSONObject; Data: TObject;
  JsonCustomizer: TJSONPopulationCustomizer);

[...]

        else if jsonFieldVal is TJSONArray then
        begin
          rField := GetFieldType(Data, FieldName);
          // Unmarshal TList<T>.FListHelper as dynamic array using 10.2 layout
          if (rField.FieldType.Handle = TypeInfo(System.Generics.Collections.TListHelper)) and // Hier kracht's, wenn rField = NIL
             (I < JsonFields.Count - 1) and
             (string.CompareText('listHelper', FieldName) = 0) and
             (string.CompareText('items', JsonFields.Pairs[I + 1].JsonString.Value) = 0) then
          begin
            // "listHelper":[2] - ignore
            Inc(I);
            // "items":[{},{}]
            jsonFieldVal := JsonFields.Pairs[I].JsonValue;
            LValue := rField.GetValue(Data); // Get FListHelper
            SetTListHelperValueFromArrayValue(FRTTICtx, LValue,
              function (AArrType: TRttiType): TValue
              begin
                Result := JSONToTValue(jsonFieldVal, AArrType);
              end);
            rField.SetValue(Data, LValue); // Set FListHelper
          end
          else
            SetFieldArray(Data, FieldName, TJSONArray(jsonFieldVal));
        end
Immer dann, wenn ein Array nicht deklariert ist, gibt GetFieldType(Data, FieldName) NIL zurück, worauf prompt eine AccessViolation - Exception folgt. In unserem Fall waren das die Arrays 'images' und 'available_markets'.
Deshalb habe ich nun versucht, diese in die Typ-Deklarationen einzufügen. Bei 'images' ist mir das gelungen, nicht jedoch bei 'available_markets', was laut Spotify Web API Dokumentation als 'Array of Strings' deklariert ist.
Delphi-Quellcode:
  
// Von mir hinzugefügt:
TImage = class
  private
    FHeight: Integer;
    FWidth: Integer;
    FUrl: String;
  public
    property height: Integer read FHeight;
    property width: Integer read FWidth;
    property URL: String read FUrl;
  end;


  TAlbum = class
  private
    FArtists: TArray<TArtist>;
    FMarkets: TArray<String>;
    FName: string;
  public
    property Artists: TArray<TArtist> read FArtists;
    property available_markets: TArray<string> read FMarkets; // funktioniert nicht
    property Name: string read FName;
  end;

  TTrack = class
  private
    FAlbum: TAlbum;
    FArtists: TArray<TArtist>;
    FId: string;
    FName: string;
    FMarkets: TArray<String>;
  public
    property Album: TAlbum read FAlbum;
    property Artists: TArray<TArtist> read FArtists;
    property Id: string read FId;
    property Name: string read FName;
    property available_markets: TArray<String> read FMarkets; // funktioniert nicht

   [...]

  TPlayList = class
  private
    FName: string;
    FImages: TArray<TImage>;
    FTracks: TPaging<TPlaylistTrack>;
  public
    property Name: string read FName;
    property Images: TArray<TImage> read FImages; //das funktioniert!
    property Tracks: TPaging<TPlaylistTrack> read FTracks;
  end;
Was mache ich bei der Deklaration falsch?
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz