【问题标题】:How do I deserialise a JSON object to a C# class that uses derived classes?如何将 JSON 对象反序列化为使用派生类的 C# 类?
【发布时间】:2011-08-17 08:27:20
【问题描述】:

我有以下类,我使用Json.NET 对 JSON 进行序列化和反序列化:

public class Message
{
  public Guid MessageId { get; set; }
  public List<Task> Tasks { get; set; }
}

public class Task
{
  public int TaskId { get; set; }
}

public SomeTask : Task
{
  public string SomeTaskThing { get; set; }
  public List<string> Operations { get; set; }
}

public OtherTask : Task
{
  public int OtherTaskThing { get; set; }
  public List<int> MoreOtherTaskThings { get; set; }
}

Message 基本上由 SomeTaskOtherTask Tasks 的列表组成,我将它们通过线路传递到也知道这些类的消息处理器。

当我序列化 Message 时,我会执行以下操作:

string json = JsonConvert.SerializeObject(
        message, 
        Formatting.Indented, 
        new JsonSerializerSettings
          {
            TypeNameHandling = TypeNameHandling.Objects
          });

我的派生类与嵌入在 JSON 中的 $type 名称一样被序列化。

但是,当我将 JSON 字符串反序列化回 Message 对象时,反序列化器不会重新水化我的派生类对象。我只是得到了基类Task的列表。

我认为使用TypeNameHandling = TypeNameHandling.Objects 添加到 JSON 字符串中的 $type 可能会向反序列化器提供关于要实例化哪些类的提示,但我错了。

我需要做什么来反序列化基类为Task 的对象并将派生类重新水化为List&lt;Task&gt;

对于这个项目,我仅限于 .NET Framework 3.5。

【问题讨论】:

    标签: c# json.net


    【解决方案1】:

    确保您也使用相同的JsonSerializerSettings 进行反序列化。它不必是同一个实例,但必须设置 TypeNameHandling = TypeNameHandling.Objects 才能进行反序列化。

    【讨论】:

    • 啊……这完全击中了我的盲点。谢谢。
    猜你喜欢
    • 2017-06-05
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多