2012-09-12 15 views
9

Ich Deserialisierung der JSON-Zeichenfolge zu Stammobjekt, indem Sie die folgende Klasse verwenden, die einwandfrei funktioniert.Warum funktioniert JSON.NET nicht mit Vererbung beim Deserialisieren

[Serializable] 
    public class MoviesListRootObject 
    { 
     public int count { get; set; } 
     public Pagination pagination { get; set; } 
     public List<Response> response { get; set; } 
    } 

...................................

var json = wc.DownloadString(jsonRequestURL); 
var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json); 

Aber Wenn ich das Root-Objekt verallgemeinere, indem ich die Elternklasse erstelle und dann von ihr erben werde, dann bekomme ich null nach der Deserialisierung !!!!

[Serializable] 
    public class RootObject 
    { 
     public int count { get; set; } 
     public Pagination pagination { get; set; } 
    } 

[Serializable] 
    public class MoviesListRootObject:RootObject 
    { 
     public List<MovieResponse> movieResponse { get; set; } 

    } 

........................................... ...

var json = wc.DownloadString(jsonRequestURL); 
var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json); 
+1

ist es besser, wenn Sie die Beispiel-JSON-Zeichenfolge einschließen. –

+0

Versuchen Sie, die in dieser anderen Antwort genannten Einstellungen zu verwenden: http://stackoverflow.com/a/6495299/146656, oder wenden Sie '[JsonObject (MemberSerialization.OptIn)]' auf die Basisklassedeklaration an, wie in http: // stackoverflow vorgeschlagen .com/a/6451204/146656 Wenn beide fehlschlagen, überprüfen Sie den benutzerdefinierten Ansatz in diesem Blogpost http://dotnetbyexample.blogspot.com.au/2012/02/json-deserialization-with-jsonnet-class.html – Meligy

Antwort

0

Unter der Annahme, jSON-String sieht wie folgt aus

{"movieResponse":[{"Rating":"Good"}],"count":1,"pagination":{"PageIndex":1}} 

ich mit mir, es funktioniert gut finden. Ich bin derzeit Json.net 4.5 r11

Wenn Sie serialisierte Objekt sind, wenn die Klassenstruktur wie

sieht
[Serializable] 
public class MoviesListRootObject 
{ 
     public int count { get; set; } 
     public Pagination pagination { get; set; } 
     public List<Response> response { get; set; } 
} 

Und die JSON-String sieht so etwas wie unten

{"count":1,"pagination":{"PageIndex":1},"response":[{"Rating":"Good"}]} 

Und jetzt sind Sie Wenn Sie die neue Struktur zum Deserialisieren verwenden, erhalten Sie null movieResponse, da die Eigenschaft in der neuen Struktur geändert wird.

Um dieses Problem zu lösen, erstellen Sie einen neuen benutzerdefinierten jsonConverter von JsonConverter und erstellen Sie Ihr Objekt programmgesteuert. Bitte werfen Sie einen Blick auf den Link json-deserialization-with-jsonnet-class um eine Idee zu bekommen. Falls Sie bereits darüber Bescheid wissen und das Problem weiterhin besteht, aktualisieren Sie bitte die Frage mit weiteren Details wie Json.net Version, Json String, komplette Klassenstruktur usw.

HTH.

4

Es ist ganz einfach und aus der Box Unterstützung durch json.net versehen, müssen Sie nur die folgenden JsonSettings verwenden, während der Serialisierung und Deserialisierung:

JsonConvert.SerializeObject(graph, Formatting.None, new JsonSerializerSettings() { 
    TypeNameHandling = TypeNameHandling.All, 
    TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple 
}); 

und für Deserializing den folgenden Code verwenden:

JsonConvert.DeserializeObject(Encoding.UTF8.GetString(bData), type, 
    new JsonSerializerSettings() { 
    TypeNameHandling = TypeNameHandling.All 
}); 

nehmen Sie einfach eine Notiz der JsonSerializerSettings initializer Objekt, das für Sie wichtig ist.

Verwandte Themen