将JSON反序列化为多个继承的类

Tar*_*yen 1 c# reflection json azure-cosmosdb

当我从DocumentDB序列化JSON对象时,我Control没有OptionsControl使用Options属性反序列化为。

我的课程如下Control

public class Control : IControl
{
    public Guid Id { get; set; }

    public virtual Enums.ControlType Type { get; set; }

    public string PropertyName { get; set; }

    public string ControlCssClass { get; set; }

    public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我也有OptionsControl,它继承自Control

public class OptionsControl : Control
{
    public IDictionary<string, string> Options;
}
Run Code Online (Sandbox Code Playgroud)

我也有ClickableControl

public class ClickableControl : Control
{
    public string Url { get; set; }
    public string UrlTarget { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我在Azure中使用文档资源管理器将此JSON放入documentDocumentDB中collection

Rows:
[
    {
        Controls:
        [
            {
              "PropertyName": "Relationship",
              "ControlCssClass": "",
              "Description": "",
              "Type": 3,
              "Options": [
                  {
                    "Key": "Spouse",
                    "Value": "Spouse"
                  },
                  {
                    "Key": "Child",
                    "Value": "Child"
                  },
                  {
                    "Key": "Step-child",
                    "Value": "Step-child"
                  }
              ],
           }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

当我从DocumentDB中提取数据时,我尝试将其序列化到我的Row类中:

public class Row
{
    public IList<Control> Controls { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我需要能够将任何类型的“控件”放入DocDB的控件列表中,并使C#将列表反序列化为正确的Control类(例如,基Control类或诸如OptionsControl或的派生类之一ClickableControl)。

问题是因为我要反序列化Control,所以我获得了控件上除之外的所有属性Options。或者,如果我尝试对具有Url和的序列进行反序列化,则UrlTarget只会获得基本的Control属性,而不是URL属性。我以为C#可以将反序列化的对象转换为OptionsControl或ClickableControl,但是我想那是不对的?我需要怎么做才能使DocumentDB中的JSON对象正确序列化并变成一个OptionsControl(具有Options属性),而不仅仅是基本Control?

Ako*_*agy 5

您可以尝试使用Json.NET自己序列化对象,然后将序列化的内容发布到DocumentDb中。然后,当您需要数据时,将其作为json字符串读回,并再次使用Json.NET进行反序列化。Json.NET可以处理继承,因此您只需配置它即可了解您的类型层次结构。使用TypeNameHandling设置:

http://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
};
Run Code Online (Sandbox Code Playgroud)