【问题标题】:How to read values from multiple json files in .Net Core?如何从 .Net Core 中的多个 json 文件中读取值?
【发布时间】:2021-04-09 07:18:15
【问题描述】:

我想从多个 json 文件中读取值。从默认 json 文件中获取值,但无法读取单独添加的 json 文件。下面是我的代码。

 //Reads from endpoint-defaults.json
        var endpointDefaultsBuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
                     .AddJsonFile("endpoint-defaults.json", true, true)                         
                     .AddEnvironmentVariables();
        ConfigurationEndpointDefaults = endpointDefaultsBuilder.Build();
        string signOnType = ConfigurationEndpointDefaults.GetSection("AppSettings:mastercard.mip.signOnType").Value;
       var mscdGamingList = ConfigurationEndpointDefaults.GetSection("AppSettings:paymentPostCountryProhibitionCheckStage.mscdGamingList.list").Get<string[]>();


        //Reads from config.json
        var configbuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("jsconfig1.json", true, true)
                .AddEnvironmentVariables();
        Configuration = configbuilder.Build();
        string environmentMode = Configuration.GetSection("AppSettings:mastercard.mip.hostname").Value;

这是输出。

我的 Json 文件

  1. endpoint-defaults.json

    {

       "AppSettings": {
    
         //Default MasterCard properties
         "mastercard.mip.signOnType": "ONDEMAND",
         "mastercard.mip.responseTimeout": 30,    
     }
    

    }

  2. jsconfig1.js

    {

    “应用设置”:{

     "mastercard.mip.hostname": "localhost",
     "mastercard.mip.authorisation_port": 19092,
     "mastercard.mip.test_authorisation_port": 19094,
    

    }

    }

【问题讨论】:

  • 我很困惑。您是否将两个不同的 ConfigurationBuilder.Build() 输出分配给 Configuration?
  • 是的,我是 .Net 核心的新手。如果程序不正确,请提出建议。
  • 您需要一个配置生成器,并多次调用 AddJsonFile
  • 尝试使用单个配置生成器,但没有用...获取 null
  • 您的屏幕截图中的数据与您发布的示例 json 中的数据不匹配。更具体地说,您的调试器扩展显示您尝试检索的值不存在。事实上,您的样本值都不存在。您确定您正在读取正确的文件而不是它们的旧/陈旧副本吗?如果你编译你的程序然后查看输出目录,json 文件的内容是否符合你的预期?我的猜测是他们没有。将它们设置为“始终”复制到输出目录,然后重试。

标签: c# json .net-core


【解决方案1】:

在构建 .net 核心应用程序的配置时,您始终可以使用多个 json 配置文件。您还可以包含 XML 配置文件。

我对配置结构和您使用的值知之甚少。所以这里我会用一个简单的配置例子和一个asp.net核心应用来解释一下。

我有两个配置文件。

  1. appsettings.json
  2. apisettings.json

上述两个配置文件中都有多个配置部分。

//appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "DbSettings": {
    "ConnectionString": "Data Source=localhost; Initial Catalog=CareCMSDatabase;User ID=sa; Password=Password1; TimeOut=30;"
  },
  "SmtpSettings": {
    "UserName": "someemail@domain.com",
    "Host": "someserver.smtp.com",
    "Port": "587",
    "Password":  "password"
  }
}

//apisettings.json
{
  "ProductApi": {
    "BaseUrl": "https://www.products.com/",
    "AuthEndpoint": "api/2.0/Auth/",
    "ClientId": "somelcientid",
    "ClientSecret": "someclientsecret"
  },
  "SearchApi": {
    "BaseUrl": "https://www.search.com/",
    "RandomEndpoint": "api/random",
    "AuthToken":  "sometoken"
  }
}

然后我创建 C# 类来表示配置部分。

public class SmtpSettings
{
    public string Host { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public int Port { get; set; }
}

public class DbSettings
{
    public string ConnectionString { get; set; }
}

public class ProductApiSettings
{
    public string BaseUrl { get; set; }
    public string AuthEndpoint { get; set; }
    public string ClientId { get; set; }
    public string ClientSecret { get; set; }
}

public class SearchApiSettings
{
    public string BaseUrl { get; set; }
    public string RandomEndpoint { get; set; }
    public string AuthToken { get; set; }
}

现在我将这些 JSON 文件添加到配置生成器中,同时在 Program.cs 文件中创建 HostBuilder。

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureAppConfiguration((builder) => {
                    builder.SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("appsettings.json")
                    .AddJsonFile("apisettings.json")
                    .AddEnvironmentVariables();
                });
                webBuilder.UseStartup<Startup>();
            });

以上代码会将json配置文件添加到配置生成器中,构建配置。

我现在可以检索配置部分并将它们转换为 C# 类并使用配置值。在下面的代码中,我正在访问 ConfigureServices 类的 ConfigureServices 方法中的配置部分及其值。

// 这个方法被运行时调用。使用此方法向容器添加服务。

    public void ConfigureServices(IServiceCollection services)
    {
        // Get DbSettings section from the configuration file.
        var dbSettingSection = Configuration.GetSection("DbSettings");

        // Get Configuration value and convert it to C# class object.
        var dbSettings = dbSettingSection.Get<DbSettings>();
        // Now I can access ConnectionString value from the configuration by accessing dbSettings.ConnectionString

        //Same as above, get ProductApi Section from the configuration file.
        var productApiSection = Configuration.GetSection("ProductApi");

        // Get the configuartion value and convert it to C# class object.
        var productApiSettings = productApiSection.Get<ProductApiSettings>();

        var smtpSection = Configuration.GetSection("SmtpSettings");

        var smtpSettings = smtpSection.Get<SmtpSettings>();

        var searchApiSection = Configuration.GetSection("SearchApi");

        var searchApiSettings = searchApiSection.Get<SearchApiSettings>();

        var authToken = Configuration["SearchApi:AuthToken"];

        services.AddControllersWithViews();
    }

您还可以将这些配置部分作为依赖项注入应用程序的其他部分,例如控制器或服务类。

为此,您需要将配置部分添加到服务集合中,以便将它们解析为依赖项。更改 ConfigureService 方法如下。

public void ConfigureServices(IServiceCollection services)
    {
        var dbSettingSection = Configuration.GetSection("DbSettings");

        // Add the section to service collection.
        services.Configure<DbSettings>(dbSettingSection);

        var productApiSection = Configuration.GetSection("ProductApi");

        services.Configure<ProductApiSettings>(productApiSection);

        var smtpSection = Configuration.GetSection("SmtpSettings");

        services.Configure<SmtpSettings>(smtpSection);

        var searchApiSection = Configuration.GetSection("SearchApi");

        services.Configure<SearchApiSettings>(searchApiSection);

        services.AddControllersWithViews();
    }

现在我可以在我的 HomeController 中依赖 ProductApi 配置部分,如下所示。

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    // Field for ProductApiSettings
    private ProductApiSettings _productApiSettings;

    public HomeController(IOptions<ProductApiSettings> productsApiSettings, Logger<HomeController> logger)
    {
        _logger = logger;
        // Initilizing settings object from the dependency.
        // This will have the values retrieved from the json config files.
        _productApiSettings = productsApiSettings.Value;
    }

    public IActionResult Index()
    {
        // Using properties from the settings
        var productApiAuthURL = _productApiSettings.BaseUrl + _productApiSettings.AuthEndpoint;

        return View();
    }
}

希望这能帮助您解决问题。

【讨论】:

  • 尝试使用以下代码,但再次为第二个 json 文件获取空值。 IConfiguration 配置 = null;配置=配置; var builder = new ConfigurationBuilder(); builder.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("endpoint-defaults.json", true, true).AddJsonFile("config.json", true, false);配置 = builder.Build(); var signOnType1 = Configuration.GetSection("AppSettings:mastercard.mip.signOnType"); var environmentMode1 = Configuration.GetSection("AppSettings:mastercard.mip.hostname");
  • 能否分享一下原问题中配置文件的相关内容?
  • 已分享,请查看一次
  • @user3030915 这很奇怪。我在代码中使用了您的配置文件,并且能够从这两个文件中获取配置值。我不确定这里有什么问题..为了清楚起见,我在 asp.net 核心 MVC Web 应用程序中做这个 POC。我还在项目的Program.csStartup.cs 文件中编写与配置相关的代码。你在这里做了什么不同的事情吗?
  • 是的 Chetan,我们这里没有使用 Startup.cs 文件,一切都应该在 Main 方法本身中。
猜你喜欢
  • 2023-03-12
  • 2015-10-05
  • 2019-07-21
  • 2011-03-21
  • 2018-03-15
  • 2020-07-23
  • 1970-01-01
  • 2011-10-16
  • 2019-09-11
相关资源
最近更新 更多