如何使用Newtonsoft.Json将下载的JSON字符串反序列化为抽象类C#

时间:2017-09-19 09:38:19

标签: c# json serialization json.net deserialization

我在从API中删除下载的JSON字符串时遇到问题。我想将它反序列化为抽象类,因此类型将由运行时决定。

我的代码示例:

JsonSerializerSettings settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All };
JsonClasses myObj = (JsonClasses) JsonConvert.DeserializeObject(this.Response, settings);

为了解释,在this.Response我有JSON字符串。我使用这种方式(TypeNameHandling)处理基于StackOverflow中另一个主题的反序列化,但它对我没有用 - 可能是因为他们最初将对象序列化为字符串,然后反序列化。我有一些来自抽象类JsonClasses的派生类。他们有不同的JSON结构"。有没有可能解决这个问题而不是那么困难?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您无法创建抽象类的对象:

  

MSDN:抽象类与接口密切相关。它们是无法实例化的类,并且经常要么部分实现,要么根本没有实现。抽象类和接口之间的一个关键区别是类可以实现无限数量的接口,但可以仅从一个抽象(或任何其他类)的类继承。从抽象类派生的类仍然可以实现接口。抽象类在创建组件时很有用,因为它们允许您在某些方法中指定不变的功能级别,但是在需要该类的特定实现之前,请保留其他方法的实现。它们的版本也很好,因为如果派生类需要额外的功能,它可以添加到基类而不会破坏代码。

从您的抽象类(没有正文)继承一些类,并反序列化它。

例如:

public class YourClassName : JsonClasses
{
}

更新

例如,我已经创建了一个示例通用方法,可以提供帮助:

public T DeserializeFromJsonClasses<T>() where T : JsonClasses
{
    T myObj = default(T);
    JsonSerializerSettings settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All};
    myObj = JsonConvert.DeserializeObject<T>(this.Response, settings);
    return myObj;
}