[英]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.