无法将 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]<Element>
更改为 [SomeCollection]<string>
它会看到所有元素,因此在反序列化类型集合时显然存在问题。
【问题讨论】:
【参考方案1】:你可以把Elements
改成List<Element>
,这里有一个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 中有一个Collection
的 Typed
对象的唯一方法是将它放在 json 的根目录中?
我用另一种方式更新了我的答案,你可以先获取元素,但是你不能用 this.Configuration.GetSection("config").Get "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