C# 如何将Json反序列化为我的控件类的正确派生

C# 如何将Json反序列化为我的控件类的正确派生,c#,json,serialization,C#,Json,Serialization,让我们假设我有以下几点: public class Parent { public string Id; } public class FirstChild:Parent { public string FirstName; } public class SecondChild:Parent { public string LastName; } 我有一个类型为FirstChild或SecondChild的Json,我如何将其反序列化为合适的类型,而不必检查序列化J

让我们假设我有以下几点:

public class Parent
{
    public string Id;
}

public class FirstChild:Parent
{
    public string FirstName;
}

public class SecondChild:Parent
{
    public string LastName;
}
我有一个类型为
FirstChild
SecondChild
的Json,我如何将其反序列化为合适的类型,而不必检查序列化Json的内容,因为我无法控制序列化过程

我已经尝试过上面提到的解决方案,但是我得到的是
父对象
对象(子对象的字段消失了)


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

{
  "$type": "Your.Name.Space.FirstChild, Your.Name.Space",
  "FirstName": "Blah",
  "Id": "1"
}
为此,请确保使用
TypeNameHandling进行序列化。所有

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

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

现在,反序列化代码将正常工作。

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

{
  "$type": "Your.Name.Space.FirstChild, Your.Name.Space",
  "FirstName": "Blah",
  "Id": "1"
}
为此,请确保使用
TypeNameHandling进行序列化。所有

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

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


现在,您的反序列化代码将正常工作。

您尝试反序列化的JSON是什么?FirstChild或SecondChild的序列化版本那么在此处添加
IElement
接口有什么意义呢?此外,您仍然需要显示您尝试反序列化的JSON。这几乎肯定是问题所在。问题已更新。您尝试反序列化的JSON是什么?FirstChild或SecondChild的序列化版本。那么在此处添加
IElement
接口有什么意义?此外,您仍然需要显示您尝试反序列化的JSON。这几乎肯定是问题所在。问题已更新。谢谢,您所说的“$type”是什么意思:“Your.Name.Space.FirstChild,Your.Name.Space”?我怎样才能做到?将它添加到我的模型中?问题是它是由第三方库序列化的,我无法控制序列化。然后,您需要告诉他们修复该问题,或者在反序列化时需要指定正确的类型。我c,谢谢,我使用的库是Masstransit,它的设计就是这样的,所以我认为更新序列化不是一个选项,我想我会尝试用另一种方法来修复它。你确定不能更改它吗?谢谢,“$type”是什么意思:“Your.Name.Space.FirstChild,Your.Name.Space”?我怎样才能做到?将它添加到我的模型中?问题是它是由第三方库序列化的,我无法控制序列化。然后,您需要告诉他们修复该问题,或者在反序列化时需要指定正确的类型。我c,谢谢,我使用的库是Masstransit,它的设计就是这样的,所以我认为更新序列化不是一个选项,我想我会尝试用另一种方法来修复它。你确定不能更改它吗?