Einzelnen Beitrag anzeigen

Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
157 Beiträge
 
Delphi 12 Athens
 
#11

AW: Problem bei JSON-Abfrage

  Alt 23. Sep 2020, 12: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