【问题标题】:Read dynamic parameters from appsettings.json从 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 对象

标签: c# .net-core appsettings


【解决方案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包含列表的例子,有效
  • 我更新了小提琴。请检查
猜你喜欢
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
相关资源
最近更新 更多