2012-09-12 31 views
9

我是通過使用下面的工作正常的類來將JSON字符串反序列化爲根對象。爲什麼在反序列化的時候JSON.NET不能使用繼承

[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); 

但如果我是普通的根對象bt創建父類,然後從它繼承,那麼我在反序列化後得到空!

[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

如果包含示例JSON字符串,則會更好。 –

+0

嘗試使用在這個其他答案中提到的設置:http://stackoverflow.com/a/6495299/146656或應用'[JsonObject(MemberSerialization.OptIn)]'到基類聲明中建議在http:// stackoverflow .com/a/6451204/146656如果兩者均失敗,請查看此博文中的自定義方法http://dotnetbyexample.blogspot.com.au/2012/02/json-deserialization-with-jsonnet-class.html – Meligy

回答

0

假設JSON字符串如下所示

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

我覺得它正常工作與我。我目前使用Json.net 4.5 R11

如果你是序列化對象時,類結構看起來像

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

而且JSON字符串看起來像下面

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

現在,你是使用新的結構去反序列化,那麼你將得到空movieResponse,因爲新結構中的屬性發生了變化。

要解決此問題,請創建一個新的自定義jsonConverter,從JsonConverter派生並以編程方式創建您的對象。請看鏈接json-deserialization-with-jsonnet-class以獲得一些想法。如果你已經知道這個問題,並且問題仍然存在,那麼請更新與更詳細的問題,如Json.net使用的版本,json字符串,完整的類結構等。

HTH。

4

這是很簡單的進出由json.net提供的內置支持,你只需要使用下面的JsonSettings在序列化和反序列化:

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

Deserializing使用下面的代碼:

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

只需記下JsonSerializerSettings對象初始值設定項,這對您很重要。