JSON使用Newtonsoft JSON.NET反序列化复杂的派生对象

时间:2013-08-25 08:17:40

标签: c# .net json serialization json.net

class Packet
{
    public Action{get;set;}
}

class Action
{
   string Type;
}

class ConcreteAction1 : Action
{
   base.Type="ConcreteAction1";
}

class ConcreteAction2 : Action
{
   base.Type="ConcreteAction2";
}

我收到Packet类,其中包含来自Action类的各种派生类,默认情况下,每个ConcreteActions被反序列化为基类Action,但我希望它们被反序列化作为他们的实际类型(ConcreteAction1 ,ConcreteAction2 ...)

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

使用.Parse()将其解析为对象,然后进行强制转换,或使用.DeserializeObject<T>()将其反序列化为对象。然后查看返回值是否正确,如果没有尝试其他的话。或者尝试使用标识符来查看它是哪种具体类型并挂钩到反序列化器。但这可能不是最理想的解决方案。

或者,如果您自己生成JSON,则可以使用设置。

new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }

当你序列化它时,它会将实际的具体类型写入JSON,当你反序列化它会将它转换为具体的类型。

JsonConvert.Deserialize(input, null, settings)

但是,也许有人有更好的主意。 :)