2017-01-20 3 views
0

J'ai une structure de données imbriquées: classe A contient la classe B contient la classe C contient classe D.Spécifiez un désérialiseur personnalisé pour une classe à l'intérieur d'une structure de données et laisser le reste à la valeur par défaut désérialiseur

En utilisant JSON.NET, existe-t-il un moyen d '"enregistrer" un désérialiseur personnalisé pour la classe D uniquement - permettant au désérialiseur par défaut de gérer les classes A à C - puis de désérialiser toute la structure de données avec un seul appel de méthode pour désérialiser l'objet racine de classe A? Peut-être que j'ai mal compris l'API, mais jusqu'à présent, la seule approche possible dans JSON.NET que j'ai trouvé nécessite l'écriture de désérialiseurs personnalisés pour les 4 classes afin que chacun puisse appeler le désérialiseur personnalisé pour la classe imbriquée dedans (c'est-à-dire, un désérialiseur personnalisé pour A appelle un désérialiseur personnalisé pour B, etc.). Cela nécessiterait beaucoup de travail quand tout ce que je veux vraiment, c'est personnaliser la classe D désérialisée.

+0

Quel genre de personnalisation que vous voulez atteindre? –

+0

Je pense que vous parlez de [quelque chose comme ça] (http://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm)? –

+0

@ChetanRanpariya La personnalisation que je veux réaliser est que D est en fait une interface avec deux sous-types, D1 et D2, et je veux vérifier pour voir qui il est avant de désérialiser. La façon de faire ce type particulier de personnalisation est expliquée ici: http://stackoverflow.com/questions/8030538/how-to-implement-custom-jsonconverter-in-json-net-to-deserialize-a-list-of -base Donc, je sais comment écrire le désérialiseur personnalisé, mais maintenant je veux savoir comment "l'enregistrer" pour qu'il soit invoqué pendant la désérialisation tandis que le désérialiseur par défaut gère le reste de la structure de données. – skrilmps

Répondre

0

Pour spécifier un désérialiseur personnalisé pour JSON.NET à utiliser pour une classe particulière, vous pouvez le faire avec l'attribut JsonConverter. Dans l'exemple de la question ci-dessus, la déclaration de classe D'pourrait ressembler à:

[JsonConverter(typeof(ClassDConverter))] 
public class ClassD 
{ 

} 

ClassDConverter est le désérialiseur personnalisé et doit étendre JsonConverter:

public class ClassDConverter : JsonConverter 
{ 
    public override object ReadJson(...) 
    { 
      // custom deserialization code here 
    } 

    public override bool CanConvert(Type objectType) 
    { 
      return typeof(ClassD).isAssignableFrom(objectType); 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 
} 

CanWrite retours false parce que je veux écrire un désérialiseur seulement. Si vous vouliez également le sérialiser, vous pouvez remplacer la méthode WriteJson.

Voici la page de docs API de Newtonsoft: http://www.newtonsoft.com/json/help/html/JsonConverterAttributeClass.htm

Ce site fournit un exemple et des détails supplémentaires dans le cadre de de/sérialisation d'un Enum: https://gooddevbaddev.wordpress.com/2013/08/26/deserializing-c-enums-using-json-net/