簡體   English   中英

將 appsettings.json 與 json 數組反序列化為 C# 列表

[英]Deserialize appsettings.json with json array into C# List

我有一個 C#.Net 核心控制台應用程序,如果這些日志文件包含錯誤,它應該檢查不同的日志文件,並通過 Email 通知合適的人。該應用程序有一個 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# Object 列表以遍歷不同的程序並進行日志分析等。

我使用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());
}

但是當我嘗試這樣做時,出現以下錯誤:

Newtonsoft.Json.JsonSerializationException: '無法將當前的 JSON object(例如 {"name":"value"})反序列化為類型 'System.Collections.Generic.List`1[LogAnalyzer.Model+Program]' 因為該類型需要一個JSON 數組(例如 [1,2,3])以正確反序列化。 要修復此錯誤,請將 JSON 更改為 JSON 數組(例如 [1,2,3])或更改反序列化類型,使其成為正常的 .NET 類型(例如,不是像 integer 這樣的原始類型,不是像array or List),可以從 JSON object 反序列化。JsonObjectAttribute 也可以添加到類型以強制它從 JSON object 反序列化。

我無法將 Json 更改為數組(沒有“程序”:),因為 appsettings.json 生成器需要 object 而不是數組。

我還嘗試使用此 Json 擺脫數組並使用動態 C# 屬性反序列化不同的 object 名稱,但反序列化也失敗了。

{
    "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# 列表。

我希望這里有人可以幫助我或給我提示。

您可以安裝 Microsoft.Extensions.Configuration.Binder Nuget package 並嘗試此代碼

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>>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM