如何将JSON对象反序列化为使用派生类的C#类?

时间:2011-05-03 00:06:22

标签: c# json.net

我有以下类,我使用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 Task列表组成,我将这些列表传递给一个也知道这些类的消息处理器。 / p>

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

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

我的派生类是按照我希望的方式序列化的,并且JSON中嵌入了$type个名称。

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

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

我需要做什么才能对基类为Task的对象进行反序列化,并将派生类重新水化为List<Task>

我只限于此项目的.NET Framework 3.5。

1 个答案:

答案 0 :(得分:3)

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