【问题标题】:How can I deserialize a list of different object types in a json config?如何反序列化 json 配置中不同对象类型的列表?
【发布时间】: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&lt;List&lt;BaseClass&gt;&gt;() 很可能会满足您的需求。
  • 这在很大程度上取决于。如果所有类型都有一些不同的字段 - 您可以基于它编写自定义反序列化器(System.Text.JsonJson.NET

标签: c# .net-core configuration json-deserialization


【解决方案1】:

我们在JsonConvert.SerializeObject(yourObject) 中提供了一个函数,除此之外还有一个重载,您可以在其中定义您的JsonSerializerSettings

【讨论】:

  • 我不想序列化。我想反序列化。
  • 创建描述相同顺序的类,public class NotifierConfig { public Notifiers notifiers{get;set;} } public class Notifiers { public List&lt;Notifier&gt; notifiers{get;set;}} public class Notifier { public string Name {get;set;} public string MailAddress {get;set;} } 并调用反序列化器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
相关资源
最近更新 更多