C# 为什么JSON.NET在反序列化时不使用继承
我使用下面的类将JSON字符串反序列化到根对象,该类工作正常C# 为什么JSON.NET在反序列化时不使用继承,c#,.net,c#-4.0,json.net,C#,.net,C# 4.0,Json.net,我使用下面的类将JSON字符串反序列化到根对象,该类工作正常 [Serializable] public class MoviesListRootObject { public int count { get; set; } public Pagination pagination { get; set; } public List<Response> response { get; set; } } [可序列
[Serializable]
public class MoviesListRootObject
{
public int count { get; set; }
public Pagination pagination { get; set; }
public List<Response> response { get; set; }
}
[可序列化]
公共类MoviesListRootObject
{
公共整数计数{get;set;}
公共分页分页{get;set;}
公共列表响应{get;set;}
}
var json = wc.DownloadString(jsonRequestURL);
var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json);
var json=wc.DownloadString(jsonRequestURL);
var rootObj=JsonConvert.DeserializeObject(json);
但是如果我泛化根对象bt创建父类,然后从父类继承,那么反序列化后我会得到null
[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; }
}
[可序列化]
公共类根对象
{
公共整数计数{get;set;}
公共分页分页{get;set;}
}
[可序列化]
公共类MoviesListRootObject:RootObject
{
公共列表movieResponse{get;set;}
}
var json = wc.DownloadString(jsonRequestURL);
var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json);
var json=wc.DownloadString(jsonRequestURL);
var rootObj=JsonConvert.DeserializeObject(json);
假设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; }
}
现在您正在使用新结构进行反序列化,然后您将得到nullmovieResponse
,因为新结构中的属性已更改
要解决此问题,请创建一个从jsonConverter
派生的新自定义jsonConverter,并以编程方式创建对象。请看一下链接,了解一些想法。如果您已经知道这一点,但问题仍然存在,请使用更多细节更新问题,如使用的Json.net版本、Json字符串、完整的类结构等
HTH.json.net提供了非常简单的开箱即用的支持,您只需在序列化和反序列化时使用以下JsonSettings即可:
JsonConvert.SerializeObject(graph, Formatting.None, new JsonSerializerSettings() {
TypeNameHandling = TypeNameHandling.All,
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
});
对于反序列化,请使用以下代码:
JsonConvert.DeserializeObject(Encoding.UTF8.GetString(bData), type,
new JsonSerializerSettings() {
TypeNameHandling = TypeNameHandling.All
});
请注意JsonSerializerSettings对象初始值设定项,这对您很重要 最好包括示例JSON字符串。尝试使用其他答案中提到的设置:或将
[JsonObject(MemberSerialization.OptIn)]
应用于基类声明,如中所建议的,如果两者都失败,请检查本博文中的自定义方法
JsonConvert.DeserializeObject(Encoding.UTF8.GetString(bData), type,
new JsonSerializerSettings() {
TypeNameHandling = TypeNameHandling.All
});