2017-01-20 2 views
0

ich eine verschachtelte Datenstruktur: Klasse A enthält Klasse B enthält Klasse C Klasse D.einen benutzerdefinierten Deserializer innerhalb einer Datenstruktur für eine Klasse angeben, und den Rest des Deserializer Standard verlassen

Mit JSON.NET enthält, Gibt es eine Möglichkeit, einen benutzerdefinierten Deserializer nur für Klasse D zu "registrieren", sodass der Standard-Deserializer die Klassen A bis C verarbeiten kann, und dann die gesamte Datenstruktur mit einem einzigen Methodenaufruf zu deserialisieren, um das Stammobjekt der Klasse A zu deserialisieren?

Vielleicht habe ich die API missverstanden, aber bis jetzt der einzige mögliche Ansatz in JSON.NET, den ich gefunden habe erfordert schreiben benutzerdefinierte Deserializer für alle 4 Klassen, so dass jeder den benutzerdefinierten Deserializer für die darin eingebettete Klasse aufrufen kann (dh, ein benutzerdefinierter Deserializer für A ruft einen benutzerdefinierten Deserializer für B usw. auf. Dies würde eine Menge Arbeit bedeuten, wenn alles, was ich wirklich möchte, ist, wie Klasse D deserialisiert wird.

+0

Welche Art von Anpassung möchten Sie leisten? –

+0

Ich denke du redest über [so etwas] (http://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm)? –

+0

@ChetanRanpariya Die Anpassung, die ich erreichen möchte, ist, dass D ist eigentlich eine Schnittstelle mit zwei Subtypen, D1 und D2, und ich möchte überprüfen, um zu sehen, was es vor der Deserialisierung ist. Die Art und Weise, diese spezielle Art der Anpassung zu tun, wird hier erklärt: http://stackoverflow.com/questions/8030538/how-to-implement-custom-jsonconverter-in-json-net-to-deserialize-a-list-of -base Ich kann den benutzerdefinierten Deserializer schreiben, aber jetzt möchte ich wissen, wie man ihn "registriert", so dass er während der Deserialisierung aufgerufen wird, während der Standard-Deserializer den Rest der Datenstruktur behandelt. – skrilmps

Antwort

0

Um einen benutzerdefinierten Deserializer für JSON.NET für eine bestimmte Klasse anzugeben, können Sie dies mit dem Attribut JsonConverter tun. Im Beispiel von der Frage oben, könnte der Klasse D Erklärung wie folgt aussehen:

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

} 

wo ClassDConverter der Brauch Deserializer und muss verlängern 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 kehrt false, weil ich einen Deserializer schreiben wollen nur. Wenn Sie auch serialisieren möchten, können Sie die Methode WriteJson überschreiben.

ist die entsprechende Seite von Newtonsoft der API-Dokumentation: http://www.newtonsoft.com/json/help/html/JsonConverterAttributeClass.htm

Diese Webseite ein Beispiel und weitere Details im Zusammenhang mit de bietet/Serialisierung ein Enum: https://gooddevbaddev.wordpress.com/2013/08/26/deserializing-c-enums-using-json-net/

Verwandte Themen