對於很多初學NETCORE的同學來說,怎麼從appsettings.json 文件中獲取各種類型數據,一直沒搞明白。
今天我們就對它的幾種數據格式的讀取做個說明。
appsettings.json 是我們項目的默認配置文件(我們也可以自定義其他.json文件,加到項目中),其是以json格式進行數據配置的。
那json配置就有多種格式,直接字符串、字符串數組的、對象的、對象數組的。
那都怎麼來獲取呢
一、字符串
{ "word": "太陽" }
第一種讀取方法:
直接 _configuration["配置的key"]進行讀取,適用於配置本身就是單一的key:value格式。
public class HomeController : Controller { private readonly IConfiguration _configuration; public HomeController(IConfiguration configuration) { _configuration = configuration; } public string Index(string content) { return _configuration["word"]; } }
運行起來,正確顯示
第二種方式:
public string Index(string content) { return _configuration.GetSection("word").Value; }
二、字符串數組
一般我們讀取出來到List當中
{ "word": [ "太陽" ,"月亮"] }
第一種方式,採用Bind 方法
public string Index(string content) { List<string> list = new List<string>(); _configuration.GetSection("word").Bind(list); return list.Aggregate(string.Empty,(current,s)=>current+s+",").TrimEnd(','); }
第二種方式,採用 Get方法
public string Index(string content) { var list= _configuration.GetSection("word").Get<List<string>>(); return list.Aggregate(string.Empty,(current,s)=>current+s+",").TrimEnd(','); }
第三種,採用GetChilden方法
public string Index(string content) { var list = _configuration.GetSection("word").GetChildren().Select(s => s.Value).ToList(); return list.Aggregate(string.Empty,(current,s)=>current+s+",").TrimEnd(','); }
三、對象類型
{ "word": { "name": "張三", "age": 18 } }
第一種方式
多層級的,可採用 GetSection方法的層級1:層級2:層級3等方式逐級獲取某個key的值
public string Index(string content) { string name = _configuration.GetSection("word:name").Value; string age = _configuration.GetSection("word:age").Value; return name + age; }
第二種方式,定義一個model實體對象來進行映射
public class Student { public string Name { get; set; } public int Age { get; set;} }
public string Index(string content) { var stu = new Student(); _configuration.GetSection("word").Bind(stu); return stu.Name + stu.Age; }
除了用Bind方法,一樣可以用Get方法
public string Index(string content) { var stu= _configuration.GetSection("word").Get<Student>(); return stu.Name + stu.Age; }
Bind和Get的方法區別在於,一個需要先初始化對象,一個不需要。
但是當配置不存在時,Get方法會報錯,Bind方法不會,進返回一個剛初始化的對象。
四、對象數組
對象數組的處理方式,跟對象類型基本一致,只是對象改爲數組而已。
這裏做1個例子就好
{ "word": [ { "name": "張三", "age": 18 }, { "name": "李四", "age": 19 } ]
public string Index(string content) { var stuList = new List<Student>(); _configuration.GetSection("word").Bind(stuList); return stuList.Aggregate(string.Empty, (current, s) => current + s.Name + s.Age + ",").TrimEnd(','); }
五、新增json配置文件
比如我們在項目的根目錄下,新增一個my.json文件,內容如下
{ "key": "這是新增文件" }
對於mvc項目,我們需要在Program中把新文件給加入
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((host, config) => { config.AddJsonFile("my.json",true,true); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
主要是增加標紅那段的內容。
public string Index(string content) { var str= _configuration.GetSection("key").Value; return str; }
控制器中就可通過_configuration對象正常獲取到配置內容了。
對於文件目錄,這裏要特別說明一下,很多同學沒搞清楚
配置的默認目錄是當前應用程序的根目錄,所以如果我們是在根目錄下新增文件,可直接寫“my.json”文件名即可。
若文件是在其他文件夾下,可採用這種方式
config.AddJsonFile("XXX目錄/my.json");
注意,不能是寫 /開頭,那樣路徑會錯誤哦
當然,我們也可以更改默認目錄,但是不建議,一改,就會影響所有的文件配置
改目錄,如下即可:
.ConfigureAppConfiguration((host, config) => { config.SetBasePath(Directory.GetCurrentDirectory()+"實際路徑"); config.AddJsonFile("my.json",true,true); })
再添加之前,通過SetBasePath 配置默認路徑。
六、在控制檯程序中,我們怎麼使用 Configution 對象
首先要引入 包:using Microsoft.Extensions.Configuration
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.SetBasePath(Directory.GetCurrentDirectory()); builder.AddJsonFile("appsettings.json",true,true); var config = builder.Build(); Console.WriteLine(config.GetSection("word").Value); Console.Read();
如此,就可以直接使用配置對象了
在實際項目中,我們可將其寫到一個類中,通過調用實現。