将带有json数组的appsettings.json反序列化为C#列表

tp5buhyn  于 2023-01-18  发布在  C#
关注(0)|答案(1)|浏览(185)

我有一个C# .Net核心控制台应用程序,它应该检查不同的日志文件,如果这些包含错误,并通过电子邮件通知正确的人。该应用程序有一个appsetting.json,看起来像这样:

{
  "Programs": [
    {
      "name": "program 1",
      "LoggingPath": "C:\...",
      "Emails": [
        "person1@company.com",
        "person2@company.com",
        "person3@company.com"
      ]
    },
    {
      "name": "program 2",
      "LoggingPath": "C:\...",
      "Emails": [
        "person1@company.com",
        "person2@company.com",
        "person3@company.com"
      ]
    }
  ]
}

现在我想把这个Json转换成一个C#对象列表,以迭代不同的程序,并做我的日志分析等。
我使用https://json2csharp.com将Json转换为以下C#代码:

public class Program
{
    public string name { get; set; }
    public string LoggingPath { get; set; }
    public List<string> Emails { get; set; }
}

public class Root
{
    public List<Program> Programs { get; set; }
}

初始化appsettings.json和反序列化的代码如下所示:

public static void Main(string[] args)
{
    IConfiguration configuration;
    configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .Build();

    JToken JtokenConfig = Serialize(configuration);

    Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(JtokenConfig.ToString());
}

但当我尝试这个我得到以下错误:
发生序列化异常:'无法将当前JSON对象(例如{“name”:“value”})反序列化为类型“System.Collections.Generic.List' 1[LogAnalyzer.Model+Program]”,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或者更改反序列化的类型,使其成为可以从JSON对象反序列化的普通.NET类型(例如,不是像整数这样的基元类型,也不是像数组或列表这样的集合类型)。还可以将JsonObjectAttribute添加到该类型中,以强制其从JSON对象反序列化。
我无法将Json更改为数组(没有“Programs”:),因为appsettings.json构建器需要对象而不是数组。
我还尝试使用此Json来摆脱数组,并使用动态C#属性来反序列化不同的对象名称,但反序列化也失败了。

{
    "Programs": {
        "program 1": {
            "LoggingPath": "test",
            "Emails": [
                "person1@company.com",
                "person2@company.com",
                "person3@company.com"
            ]
        },
        "program 2": {
            "LoggingPath": "test",
            "Emails": [
                "person1@company.com",
                "person2@company.com",
                "person3@company.com"
            ]
        }
    }
}

我阅读了无数的stackoverflow线程和其他网站,但无法将JSON转换为C#列表。
我希望这里有人能帮助我或给予我一个提示。

62lalag4

62lalag41#

您可以安装Microsoft.Extensions.Configuration.Binder Nuget软件包并尝试以下代码

using Microsoft.Extensions.Configuration;

List<Program> programs = configuration.GetSection("Programs").Get<List<Program>>();

更新
可以反序列化为字典第二个JSON

Dictionary<string,Program> programsDict = configuration.GetSection("Programs")
                                     .Get<Dictionary<string,Program>>();

相关问题