Comment sérialiser / désérialiser une collection personnalisée avec des propriétés supplémentaires à l'aide de Json.Net
J'ai une collection personnalisée (implémente IList) qui a certaines propriétés personnalisées comme indiqué ci-dessous:
class FooCollection : IList<Foo> {
private List<Foo> _foos = new List<Foo>();
public string Bar { get; set; }
//Implement IList, ICollection and IEnumerable members...
}
Quand je sérialiser, j'utilise le code suivant:
JsonSerializerSettings jss = new JsonSerializerSettings() {
TypeNameHandling = TypeNameHandling.Auto
};
string serializedCollection = JsonConvert.SerializeObject( value , jss );
Il sérialise et désérialise tous les articles de la collection correctement; cependant, toutes les propriétés supplémentaires dans le FooCollection
de classe ne sont pas prises en compte.
Est-il de toute façon à l'inclure dans la sérialisation?
source d'informationauteur Pierluc SS
Vous devez vous connecter pour publier un commentaire.
Le problème est le suivant: lorsqu'un objet implémente
IEnumerable
JSON.net l'identifie comme un tableau de valeurs et sérialise suivant le tableau La syntaxe Json (qui n'inclut pas les propriétés),par exemple :
Si vous voulez sérialiser en gardant les propriétés, vous devez gérer la sérialisation de l'objet à la main par la définition d'un personnalisé
JsonConverter
:De l'utiliser ensuite comme suit:
Personnellement, j'aime bien éviter d'écrire personnalisé
JsonConverter
s si possible, et au lieu d'utiliser les différentes JSON attributs qui ont été conçus à cette fin. Vous pouvez tout simplement décorerFooCollection
avecJsonObjectAttribute
où les forces de sérialisation comme un objet JSON plutôt qu'un tableau. Vous devez décorer laCount
etIsReadOnly
propriétés avecJsonIgnore
pour les empêcher d'apparaître dans la sortie. Si vous voulez garder_foos
un domaine privé, vous devez également avoir à le décorer avec desJsonProperty
.La sérialisation des rendements quelque chose comme ce qui suit:
Évidemment, cela ne fonctionne que si vous êtes en mesure de modifier la définition de
FooCollection
afin d'ajouter ces attributs, sinon, vous devrez aller dans le sens de la coutume convertisseurs.N'héritant de la Liste de travail?
Si vous aussi vous souhaitez conserver le contenu de la Liste ou de la collection elle-même,
Vous pourriez envisager d'exposer le retour du bien de la liste. Il convient de papier pour éviter cyclique problème lors de la sérialisation:
new FooCollection { 1, 2, 3, 4, 4 }
=>new FooCollection { 1, 2, 3 }.ToArray()
=>new []{1, 2, 3}.ToArray()