无法将 appsettings IConfiguration 部分反序列化为类型化元素的数组

Posted

技术标签:

【中文标题】无法将 appsettings IConfiguration 部分反序列化为类型化元素的数组【英文标题】:Can not deserialize appsettings IConfiguration section into array of typed elements 【发布时间】:2021-03-04 18:55:32 【问题描述】:

我正在尝试从我的 appsettings.json 文件中检索 IConfiguration 部分,该文件是强类型元素的数组,但我不断得到一个空集合。 我在反序列化 IConfiguration 部分时使用默认情况下 Asp .Net Core 3.1 使用的任何内容:

(我将JsonSerializer 用于所有 json 特定任务)

DTO

public class Element

   [JsonPropertyName("key")]
   public string Key get;set;
   [JsonPropertyName("value")]
   public string Valueget;set;


public class Elements

   [JsonPropertyName("fields")]
   public IEnumerable<Element>Fieldsget;set;

public class Config

   [JsonPropertyName("elements")]
   public Elements Elementsget;set;

appsettings.json


  "config":
    "fields":[
      "key":"a","value":"aa",
      "key":"b","value":"bb",
      "key":"c","value":"cc"
   

启动

public class Startup
    
        public IConfiguration Configuration  get; 

        public Startup(IConfiguration configuration) 
            this.Configuration = configuration;
        
        public void ConfigureServices(IServiceCollection services) 
            Config config=this.Configuration.GetSection("config").Get<Config>(); // elements count is 0
            Elements elements =  this.Configuration.GetSection("config:elements").Get<Elements>();  // elements count is 0
            
        

我试过了:

将我的 IEnumerable 类型元素 (Elements) 更改为 Array,List,IList 无济于事 将我的 Elements 字段直接放在根目录中无济于事

P.S如果我从 [SomeCollection]&lt;Element&gt; 更改为 [SomeCollection]&lt;string&gt; 它会看到所有元素,因此在反序列化类型集合时显然存在问题。

【问题讨论】:

【参考方案1】:

你可以把Elements改成List&lt;Element&gt;,这里有一个demo:

DTO:

public class Element
    
        [JsonPropertyName("key")]
        public string Key  get; set; 
        [JsonPropertyName("value")]
        public string Value  get; set; 
    


    public class Config
    
        [JsonPropertyName("fields")]
        public List<Element> Fields  get; set; 
    

启动:

Config config=this.Configuration.GetSection("config").Get<Config>(); 

更新:

另一种方式:

DTO:

public class Element

   [JsonPropertyName("key")]
   public string Key get;set;
   [JsonPropertyName("value")]
   public string Valueget;set;


public class Elements

   [JsonPropertyName("fields")]
   public IEnumerable<Element>Fieldsget;set;

public class Config

   [JsonPropertyName("elements")]
   public Elements Elementsget;set;

启动:

Elements elements = this.Configuration.GetSection("config").Get<Elements>(); 
Config config= new Config  Elements = elements ;

【讨论】:

所以你的意思是在 json 中有一个 CollectionTyped 对象的唯一方法是将它放在 json 的根目录中? 我用另一种方式更新了我的答案,你可以先获取元素,但是你不能用 this.Configuration.GetSection("config").Get(); 获取配置,因为你的 appsetting不是 "config": "elements": "fields": [ "key": "a", "value": "aa" , "key": "b", "value": "bb" , "key": "c", "value": "cc" ]

以上是关于无法将 appsettings IConfiguration 部分反序列化为类型化元素的数组的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 Windows 窗体应用程序中的 ConfigurationManager.AppSettings

无法从“字符串”转换为“Photon.RealTime.AppSettings”

无法从 asp dot net 3.1 中的 appsettings.json 读取字符串数组

从 .NET Core 2 中的类中读取 appsettings.json

Asp.Net Core 中无法使用 ConfigurationManager.AppSettings

读取 Main Program.cs 中的 appsettings.json