如何将Json反序列化为Control类的正确派生类

时间:2018-01-23 10:09:15

标签: c# json serialization

我们说我有以下内容:

public class Parent
{
    public string Id;
}

public class FirstChild:Parent
{
    public string FirstName;
}

public class SecondChild:Parent
{
    public string LastName;
}

我有一个类型为FirstChildSecondChild的Json,如何将其反序列化为合适的类型,而无需检查序列化JSON的内容,因为我知道我无法控制序列化过程?

我已经尝试了here提到的解决方案,但我得到的是Parent对象(孩子的字段已经消失)。

JsonSerializerSettings settings = new JsonSerializerSettings 
{
    TypeNameHandling = TypeNameHandling.All 
};
var deserialized = JsonConvert.DeserializeObject<Parent>(
    Serialized FirstChild/SecondChild, 
    settings);

Json样本:

{\"firstName\":\"John\",\"id\":\"1\"}

1 个答案:

答案 0 :(得分:2)

要使用Newtonsoft.Json正确反序列化派生类型,JSON字符串需要包含名称为$type的元素和包含类型名称的值。例如,正确序列化的FirstChild对象将如下所示:

{
  "$type": "Your.Name.Space.FirstChild, Your.Name.Space",
  "FirstName": "Blah",
  "Id": "1"
}

为此,请确保使用TypeNameHandling.All序列化:

JsonSerializerSettings settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
};

var json = JsonConvert.SerializeObject(yourFirstParentObject, settings);

现在您的反序列化代码将正常运行。