JSON.NET: Comment faire pour désérialiser interface bien sur la base d'un parent (titulaire) la valeur de l'objet?
J'ai ces classes
class Holder {
public int ObjType { get; set; }
public List<Base> Objects { get; set; }
}
abstract class Base {
//... doesn't matter
}
class DerivedType1 : Base {
//... doesn't matter
}
class DerivedType2 : Base {
//... doesn't matter
}
À l'aide de WebAPI je veux recevoir l'objet Holder
et désérialiser correctement. Basé sur le ObjType
valeur que j'ai besoin Objects
bien être désérialisé soit comme List<DerivedType1>
(ObjType == 1
) ou List<DerivedType2>
(ObjType == 2
).
Pour le moment j'ai cherché SI et internet pour la meilleure approche, mais la meilleure que j'ai trouvé est cette réponse https://stackoverflow.com/a/8031283/1038496. Le problème de cette solution est qu'elle lâche contexte de l'objet parent, je ne peux pas trouver la valeur de ObjType
. OK, j'ai pu le résoudre en créant personnalisé JsonConverter
pour Holder
et remebering la ObjType
valeur, mais je suis peur de cette ligne
serializer.Populate(jObject.CreateReader(), target);
que le commentaire en dessous de cette réponse dit
La nouvelle JsonReader créé dans le ReadJson méthode n'héritent pas l'un de l'original du lecteur valeurs de configuration (Culture, DateParseHandling, DateTimeZoneHandling, FloatParseHandling, etc...). Ces valeurs doivent être copiés avant d'utiliser le nouveau JsonReader dans sérialiseur.Remplir().
qui est un problème pour moi et de copier ces valeurs par moi-même ne semble pas propre à moi (si j'ai raté quelque chose?)
La question est donc: Est-il une meilleure approche que j'ai manqué de désérialiser objet abstrait de la propriété fondée sur la propriété parent de la valeur?
Vous devez vous connecter pour publier un commentaire.
Vous êtes sur la bonne voie. Vous avez besoin de mettre en œuvre une coutume
JsonConverter
pour votreHolder
classe pour gérer cette situation, comme vous l'avez suggéré. Mais, ne vous inquiétez pas, il est possible d'écrire le convertisseur de telle manière que vous pouvez utiliser le lecteur d'origine et sérialiseur cas transmis au convertisseur, sans jamais avoir besoin de copier les paramètres sur les nouvelles instances. Voici comment j'allais l'écrire:Voici une démonstration rapide:
De sortie: