【发布时间】:2021-09-07 16:37:47
【问题描述】:
我正在使用Microsoft.Extensions.Configuration 从 json 文件中读取配置对象。
但我不知道如何反序列化一个充满了从基类派生的项目的List<BaseClass>。
我假设,您必须将对象的类型存储在某处(例如 newtonsoft 的 JsonConvert.SerializeObject() 中的 here),但我无法反序列化它。
编辑:
这是我想做的一个例子。一、配置项:
public abstract class Notifier
{
public string Name { get; set; }
public abstract void Notify(string message);
}
public class MailNotifier : Notifier
{
public string MailAddress { get; set; }
public override void Notify(string message)
{
Console.WriteLine("Send mail with message '" + Name + "' to " + MailAddress);
}
}
public class SmsNotifier : Notifier
{
public string PhoneNumber { get; set; }
public override void Notify(string message)
{
Console.WriteLine("Send SMS with message '" + Name + "' to " + PhoneNumber);
}
}
public class NotifierConfig
{
public List<Notifier> Notifiers { get; set; }
}
理想情况下,我希望得到这样的配置:
NotifierConfig config = configuration.Get<NotifierConfig>();
config.json 看起来像这样:
{
"NotifierConfig": {
"Notifiers": [
{
//"type": "MailNotifier",
"Name": "MailNotifier_Admin",
"MailAddress": "admin@somecompany.com"
},
{
//"type": "MailNotifier",
"Name": "MailNotifier_CEO",
"MailAddress": "ceo@somecompany.com"
},
{
//"type": "SmsNotifier",
"Name": "SmsNotifier_Admin",
"PhoneNumber": "1234567"
},
{
//"type": "SmsNotifier",
"Name": "SmsNotifier_CEO",
"PhoneNumber": "7654321"
}
]
}
}
【问题讨论】:
-
给我们一些示例数据怎么样?
-
config.GetSection("sectionName").Get<List<BaseClass>>()很可能会满足您的需求。 -
这在很大程度上取决于。如果所有类型都有一些不同的字段 - 您可以基于它编写自定义反序列化器(
System.Text.Json和Json.NET)
标签: c# .net-core configuration json-deserialization