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

时间:2012-09-12 05:18:43

标签: c# .net c#-4.0 json.net

我使用下面的类将JSON字符串反序列化为root对象。

[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然后继承它,那么在反序列化后我得到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; }

    }

.............................................. < / p>

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

2 个答案:

答案 0 :(得分: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对象初始化程序,这对您很重要。

答案 1 :(得分: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"}]}

现在您正在使用新结构进行反序列化,然后您将获得null movieResponse,因为在新结构中更改了属性。

要解决此问题,请创建一个从JsonConverter派生的新自定义jsonConverter,并以编程方式创建对象。请查看链接json-deserialization-with-jsonnet-class以获取一些想法。如果你已经知道这个并且问题仍然存在,那么请更新问题更详细,如使用的Json.net版本,json字符串,完整的类结构等

HTH。