从 appsettings.json 读取动态参数
Posted
技术标签:
【中文标题】从 appsettings.json 读取动态参数【英文标题】:Read dynamic parameters from appsettings.json 【发布时间】:2022-01-10 22:09:05 【问题描述】:我正在开发 APIExecutor 项目,它是一个控制台应用程序,从 Appsettings.json 文件中读取所需的配置。如下所示:
"APIConfig":
"RootAPI": "https://hub.dummyapis.com",
"API": [
"Url": "/employee",
"Method": "GET",
"Params":
"noofRecords": 10,
"idStarts": 1001
,
"RequestType": "application/json",
"Headers": null
,
"Url": "/student",
"Method": "POST",
"Params":
"name": "ABC",
"adress": "bla bla bla",
"IsPassed": true,
,
"RequestType": "application/json",
"Headers": null
]
我想把它映射到下面的类中
public class APIConfig
public string Url get; set;
public string Method get; set;
public dynamic Params get; set;
public string RequestType get; set;
public List<RequestHeaders> Headers get; set;
上面的参数中,Params可以是任何东西,不知道Params应该是什么类型,严格依赖API调用。所以,我试图让它动态和对象,但是当我尝试如下获取它时:
var config = _builder.GetSection("APIConfig").Get<APIConfig>()
这里,_builder 是 IConfiguration 的一个实例。
请注意:参数不是固定的。它可以是任意的,具体取决于 API 调用。
在配置中获取 null。我知道这是因为动态参数。如果我删除该参数,则它会成功映射。
从 appsettings.json 读取配置时,我找不到任何映射动态参数的方法
【问题讨论】:
你想达到什么目的。因为该文件将在应用程序的每个生命周期加载一次。或者您正在编写一个库来读取所有参数。您是否尝试过 Object 而不是 dynamic? 是的,它仍然在配置中给出 null 这里是小提琴:dotnetfiddle.net/gvwsqu。请注意,我评论了 Params 对象 【参考方案1】:尝试使用 public Dictionary
public class APIConfig
public string RootAPI get; set;
public List<API> API get; set;
public class API
public string Url get; set;
public string Method get; set;
public Dictionary<string,object> Params get; set;
public string RequestType get; set;
public object Headers get; set;
已使用此代码进行测试并正常工作
APIConfig apiConfig = configuration.GetSection("APIConfig").Get<APIConfig>();
但是你想用这样的嵌套元素反序列化 json
"APIConfig":
"RootAPI": "https://hub.dummyapis.com",
"API": [
"Url": "/employee",
"Method": "GET",
"Params":
"noofRecords": 10,
"idStarts": 1001,
"Items": [
"item1": "value1"
,
"item2": "value2"
]
,
"RequestType": "application/json",
"Headers": null
]
,
您必须直接从文件中加载 json,因为它似乎只下载一个级别的配置
string basePath=Directory.GetCurrentDirectory(); // or any else
string json = string.Empty;
using (StreamReader r = new StreamReader(basePath+@"\appsettings.json"))
json = r.ReadToEnd();
var jsonObject = JObject.Parse(json)["APIConfig"];
var config=jsonObject.ToObject<APIConfig>();
测试
var items = (JArray) config.API[0].Params["Items"];
foreach (JObject item in items)
foreach(var val in item.Properties())
Console.WriteLine($"Key: val.Name Value: val.Value");
项目
Key: item1 Value: value1
Key: item2 Value: value2
【讨论】:
亲爱的,这里的参数不是固定的。我们必须把它当作动态的或对象的 感谢@Serge的努力,当参数包含列表时它不起作用 @Pls 贴出appsettings包含列表的例子,有效 我更新了小提琴。请检查以上是关于从 appsettings.json 读取动态参数的主要内容,如果未能解决你的问题,请参考以下文章
从 .NET Core 2 中的类中读取 appsettings.json
无法从 asp dot net 3.1 中的 appsettings.json 读取字符串数组
NET问答: 不能从 appsettings.json 中以 string[] 形式读取?
读取 Main Program.cs 中的 appsettings.json