从 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 Params 来使用这些类

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

如何从 appsettings.json 文件中的对象数组中读取值

从 .net 标准库中读取 appsettings.json