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?