In einer meiner letzten Blogeinträge, sprach ich über meine Erfahrungen zu dem noch nicht so ganz vollständig dokumentierten JSON Serialisierer ab Tokio, hier nachzulesen unter Neuer JSOJN Serialisierer ab Tokyo
Bis jetzt hat er mir wertvolle Dienste erwiesen. Er ist ein Serialisierer wie man ihn sich wünscht bzw. kennt. Durch Unittests konnte ich diverse Möglichkeiten austesten. Zum Beispiel wollte ich nicht nur ein dynamisches TArray<T> als Liste exportieren, sondern auch eine TList<T>. Bei der TList<T> wurden aber immer alle Felder ins JSON geschrieben welche ich gar nicht brauchte. Natürlich gäbe es die Möglichkeit einer Ableitung und diese mit Attributen zu versehen aber wieso was neues erfinden. Eine andere aber meiner Meinung nach unschöne, ist das konvertieren einer TList<T> ToArray, ginge auch aber...
Durch SetFieldsIgnored schliesse ich Felder aus, welche ich nicht im JSON haben möchte. Mit SetFieldName gebe ich ihnen einen anderen Namen.
Bis jetzt hat er mir wertvolle Dienste erwiesen. Er ist ein Serialisierer wie man ihn sich wünscht bzw. kennt. Durch Unittests konnte ich diverse Möglichkeiten austesten. Zum Beispiel wollte ich nicht nur ein dynamisches TArray<T> als Liste exportieren, sondern auch eine TList<T>. Bei der TList<T> wurden aber immer alle Felder ins JSON geschrieben welche ich gar nicht brauchte. Natürlich gäbe es die Möglichkeit einer Ableitung und diese mit Attributen zu versehen aber wieso was neues erfinden. Eine andere aber meiner Meinung nach unschöne, ist das konvertieren einer TList<T> ToArray, ginge auch aber...
Wie man nur einen Teil der vordefinierten Typen serialisieren kann!
In diesem Fall kommt man um ein bisschen Code nicht herum, aber man kann mit TJsonDynamicContractResolver dynamisch Attribute hinzufügen oder entfernen. Wie macht man dies?function TNathanUDV2Dto.ToJson: string;
var
Serializer: TJsonSerializer;
Resolver: TJsonDynamicContractResolver;
begin
Serializer := TJsonSerializer.Create;
try
Resolver := TJsonDynamicContractResolver.Create;
Resolver.ClearAttributes;
Resolver.SetFieldsIgnored(TypeInfo(TList), ['FListHelper', 'FComparer']);
Resolver.SetFieldName(TypeInfo(TList), 'FItems', 'Values');
Serializer.ContractResolver := Resolver;
Result := Serializer.Serialize(Self);
finally
Serializer.Free;
end;
end;
Durch SetFieldsIgnored schliesse ich Felder aus, welche ich nicht im JSON haben möchte. Mit SetFieldName gebe ich ihnen einen anderen Namen.
Kommentare
Kommentar veröffentlichen