Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么JSON.NET在反序列化时不使用继承_C#_.net_C# 4.0_Json.net - Fatal编程技术网

C# 为什么JSON.NET在反序列化时不使用继承

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; } } [可序列

我使用下面的类将JSON字符串反序列化到根对象,该类工作正常

[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; }
}
现在您正在使用新结构进行反序列化,然后您将得到null
movieResponse
,因为新结构中的属性已更改

要解决此问题,请创建一个从
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
});