Nee, geen JsonMarshalled gebruikt, maar dus wel Rest.Json.Types in de uses gezet.
Hier is de hele test-unit. Voeg toe aan een lege console application en roep `TestDeserialize` aan.
Ik ben benieuwd of het dan werkt, en zo niet, of je Compiler Warnings krijgt over dat attribute. Merk op dat ik dit in Rio heb getest, en dat ik TMSCalendarEventsResponse iets aangepast heb voor de test.
Wellicht ten overvloede, maar ik bedoel dus niet te zeggen dat je jouw code moet vervangen. Ik wil enkel aantonen dat het serializeren van Delphi, en specifiek het gebruik van dat attribute, staat of valt bij het usen van die ene unit!
Delphi Code:
unit uTestDeserialize;
interface
uses
System.Json,
Rest.Json.Types, // << -- Zonder deze compileert het wel, maar werkt het niet
Rest.JsonReflect;
procedure TestDeserialize;
function MapJson(Json: String; ConvertToClass: TClass): TObject;
type
TMSCalendarEventsResponse = class
private
[JSONName('odata.bork')]
Fodatabork: String;
[JSONName('@odata.context')]
Fodatacontext: String;
[JSONName('@odata.nextLink')]
Fodatanextlink: String;
public
property odatacontext: String read Fodatacontext write Fodatacontext;
property odatanextlink: String read Fodatanextlink write Fodatanextlink;
end;
implementation
function MapJson(Json: String; ConvertToClass: TClass): TObject;
var
UnMarshaller: TJSONUnMarshal;
Dto: TObject;
JsonObject: TJSONObject;
begin
UnMarshaller := TJSONUnMarshal.Create;
JsonObject := TJSONObject.ParseJSONValue(Json) as TJsonObject;
try
UnMarshaller.TryCreateObject(ConvertToClass, JsonObject, Dto);
Result := Dto as ConvertToClass;
finally
JsonObject.Free;
end;
end;
procedure TestDeserialize;
var
a: TMSCalendarEventsResponse;
begin
a := MapJson('{"odata.bork": "bork", "@odata.context": "koe", "@odata.nextLink": "big"}', TMSCalendarEventsResponse) as TMSCalendarEventsResponse;
writeln('Props');
writeln(a.Fodatabork);
writeln(a.Fodatacontext);
writeln(a.Fodatanextlink);
readln;
end;
end.
Bookmarks