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?
您可以尝试使用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)
| 归档时间: |
|
| 查看次数: |
1431 次 |
| 最近记录: |