【问题标题】:How to deserialize downloaded JSON string to abstract class C# with Newtonsoft.Json如何使用 Newtonsoft.Json 将下载的 JSON 字符串反序列化为抽象类 C#
【发布时间】:2017-09-19 09:38:19
【问题描述】:

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

我的代码示例:

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

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

感谢您的帮助!

【问题讨论】:

  • 为什么不JsonConvert.DeserializeObject<JsonClasses>(this.Response, settings)
  • 你想如何创建一个抽象类的对象?
  • 很抱歉我写的不太正确。我需要创建一些继承类的实例,但返回对象是 JsonClasses 类型(这些继承类的父类)。但即使我使用 var test = JsonConvert.DeserializeObject(this.Response, settings);它没有工作
  • JsonClasses 是抽象的还是派生的?您需要在泛型参数JsonConvert.DeserializeObject<NonAbstractType>(json) 中指定派生的非抽象类型。

标签: c# json serialization json.net deserialization


【解决方案1】:

你不能创建抽象类的对象:

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;
}

【讨论】:

  • 很抱歉我写的不太正确。我需要创建一些继承类的实例,但返回对象是 JsonClasses 类型(这些继承类的父类)。
  • @AndrewLerion 好的,我已经更新了我的答案,请看一下。
  • 非常感谢! :) 现在它可以按我的意愿工作了。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多