.net core中編輯json配置文件的方法
引言
最近在具體項(xiàng)目開發(fā)應(yīng)用中,項(xiàng)目采用的json格式配置文件,配置文件的加載采用的IConfiguration接口對(duì)象進(jìn)行的管理,這是.net standard時(shí)代,微軟所提供的現(xiàn)代化的配置管理工具。
項(xiàng)目設(shè)計(jì)中,需要在運(yùn)行過程中,將遠(yuǎn)程服務(wù)端發(fā)送過來的配置信息回寫到配置文件中。然而,必應(yīng)也好,百度也罷,翻遍網(wǎng)絡(luò),這套現(xiàn)代化的配置管理模型中,卻找不到一個(gè)可以改變配置回寫的方法。
無奈之下,只好自己動(dòng)手,手動(dòng)造輪子了。
.NET Standard時(shí)代的配置模型
隨著.NET Standard時(shí)代的來臨,System.Configuration在.net core中已經(jīng)不存在了,那么取而代之的是Microsoft.Extensions.Configuration系列配置管理類庫:
Microsoft.Extensions.Configuration.Abstractions:基礎(chǔ)接口
Microsoft.Extensions.Configuration:實(shí)現(xiàn)上面的基礎(chǔ)接口
Microsoft.Extensions.Configuration.FileProviderExtensions:提供重載配置擴(kuò)展
Microsoft.Extensions.Configuration.Binder:提供轉(zhuǎn)換到實(shí)體功能
Microsoft.Extensions.Configuration.FileExtensions:提供配置文件根路徑擴(kuò)展
相關(guān)文章資源
關(guān)于以上類庫的使用,網(wǎng)上有大量相關(guān)文章,如知名博主大內(nèi)老A的文章中,有著系統(tǒng)、詳細(xì)闡述,各位可自行查閱。
鏈接在此:https://www.cnblogs.com/artech/p/config-for-net-core.html
配置類的建議用法
出于編程上的便利,我們通常不會(huì)直接利用ConfigurationBuilder創(chuàng)建的Configuration對(duì)象讀取某個(gè)單一配置項(xiàng)的值,而是傾向于將一組相關(guān)的配置綁定為一個(gè)對(duì)象。
例如筆者某個(gè)項(xiàng)目消息主題配置參數(shù)類如下:
public class TopicConfig { public string Project { get; set; } ="ibms"; public string Device { get; set; } = "gateway"; public string City { get; set; } = "wuhan"; public string Area { get; set; } = "poly"; }
我們可以為配置類指定默認(rèn)參數(shù)。
在需要使用配置參數(shù)的對(duì)象中,我們可以將配置類設(shè)置為屬性字段
private TopicConfig topicConfig = new TopicConfig();
當(dāng)對(duì)象類被實(shí)例化時(shí),配置類將自動(dòng)被構(gòu)造并擁有默認(rèn)配置參數(shù)
我們?cè)谛枰褂门渲玫膶?duì)象類中,寫一個(gè)加載配置類的方法和保存配置類的方法,當(dāng)對(duì)象類構(gòu)造時(shí),調(diào)用并執(zhí)行加載配置文件。
當(dāng)配置文件存在時(shí),判斷對(duì)應(yīng)的配置段是否存在,如果存在,則綁定到對(duì)應(yīng)的配置類,從而實(shí)現(xiàn)配置參數(shù)的加載(對(duì)象類中,相關(guān)需要使用配置參數(shù)的地方,直接從配置類的獲取參數(shù));
當(dāng)配置文件不存在時(shí),加載配置方法調(diào)用保存配置方法,將默認(rèn)配置回寫到配置文件中。
當(dāng)配置參數(shù)動(dòng)態(tài)更新后需要保存時(shí),也通過調(diào)用保存配置方法,將配置參數(shù)更新到配置文件中。
示例json配置文件
{ "topic": { "Project": "ibms", "Device": "gateway", "City": "wuhan", "Area": "poly" } }
加載配置方法
筆者采用程序目錄下的"appsettings.json"文件作為配置文件
private void LoadConfig() { var path = Directory.GetCurrentDirectory(); var config_file = "appsettings.json"; var full_path = Path.Combine(path, config_file); if (File.Exists(full_path)) { var builder = new ConfigurationBuilder() .SetBasePath(path) .AddJsonFile("appsettings.json"); IConfiguration Configuration = builder.Build(); if (Configuration.GetSection(Topic).Exists())//Topic為字符串常量,對(duì)應(yīng)配置段屬性名稱 Configuration.GetSection(Topic).Bind(topicConfig);//綁定配置數(shù)據(jù)到配置類 } else { SaveConfig(); } }
在dotnet core由于采用了更為模塊化的設(shè)計(jì)方式,使用配置類需要引用相應(yīng)的程序包,我們?cè)诔绦蛑惺褂胘son配置,需要安裝Microsoft.Extensions.Configuration.Json程序包。
Bind方法為擴(kuò)展方法,需要項(xiàng)目中先安裝Microsoft.Extensions.Configuration.Binder程序包。
程序包可通過Nuget包管理器進(jìn)行安裝。
保存配置方法
private void SaveConfig(string path = "") { if (path == "") path = Directory.GetCurrentDirectory(); Dictionary<string, object> sectionsInfo = new Dictionary<string, object>(); sectionsInfo.Add(Topic, topicConfig); //Topic為字符串常量,對(duì)應(yīng)配置段屬性名稱 JsonConfigHelper.SaveJson(sectionsInfo, path); }
調(diào)用json配置保存類,將配置保存到指定的位置。
通用Json配置保存類
筆者針對(duì)需要改寫配置文件的應(yīng)用的需要,自行實(shí)現(xiàn)了一個(gè)保存json格式配置文件的通用類,支持同時(shí)保存多個(gè)配置類。
支持對(duì)現(xiàn)有配置文件節(jié)點(diǎn)的改寫和追加配置節(jié)點(diǎn)。
using System; using System.Collections.Generic; using System.IO; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace flyfire.Common { public class JsonConfigHelper { public static bool SaveJson(Dictionary<string,object> sectionInfo, string configFilePath, string configFileName = "appsettings.json") { if (sectionInfo.Count==0) return false; try { var filePath = Path.Combine(configFilePath, configFileName); JObject jsonObject; if (File.Exists(filePath)) { using (StreamReader file = new StreamReader(filePath)) { using (JsonTextReader reader = new JsonTextReader(file)) { jsonObject = (JObject)JToken.ReadFrom(reader); } } } else { jsonObject = new JObject(); } foreach (var key in sectionInfo.Keys) { jsonObject[key] = JObject.FromObject(sectionInfo[key]); } using (var writer = new StreamWriter(filePath)) using (JsonTextWriter jsonwriter = new JsonTextWriter(writer) { Formatting = Formatting.Indented,//格式化縮進(jìn) Indentation = 4, //縮進(jìn)四個(gè)字符 IndentChar = ' ' //縮進(jìn)的字符是空格 }) { jsonObject.WriteTo(jsonwriter); return true; } } catch (Exception) { return false; } } } }
至此,我們完成了Json格式配置文件的加載、綁定與保存。
以上就是.net core中編輯json配置文件的詳細(xì)內(nèi)容,更多關(guān)于.net core json配置文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ASP.NET筆記之Session、http、web開發(fā)原則、xss漏洞的詳細(xì)介紹
本篇文章小編為大家介紹,ASP.NET筆記之Session、http、web開發(fā)原則、xss漏洞詳細(xì)。需要的朋友參考下2013-04-04近幾天對(duì)DataSet的新認(rèn)識(shí)
近幾天對(duì)DataSet的新認(rèn)識(shí)...2007-04-04ASP.NET MVC中HtmlHelper控件7個(gè)大類中各個(gè)控件使用詳解
本文主要介紹HtmlHelper類控件的使用方法,給初涉MVC的朋友一些幫助,有需要的朋友可以參考一下。2016-03-03DropDownList根據(jù)下拉項(xiàng)的Text文本序號(hào)排序
在某些時(shí)候表中沒有可以排序的字段同時(shí)呢也不想修改表結(jié)構(gòu),但它的項(xiàng)文本有序號(hào)這時(shí)就可以用這方法排序,感興趣的你可以參考下,或許本文知識(shí)點(diǎn)對(duì)你有所幫助2013-03-03ubuntu16.4下用jexus部署ASP.NET Core環(huán)境
這篇文章主要以圖文結(jié)合的方式介紹了ubuntu16.4下ASP.NET Core部署環(huán)境搭建步驟,感興趣的小伙伴們可以參考一下2016-07-07.NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例
本篇文章小編將為大家介紹,.NET中 關(guān)于臟讀 不可重復(fù)讀與幻讀的代碼示例,有需要的朋友可以參考一下2013-04-04ASP.NET?MVC5網(wǎng)站開發(fā)項(xiàng)目框架(二)
這篇文章主要介紹了ASP.NET?MVC5網(wǎng)站開發(fā)項(xiàng)目框架,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-09-09asp.net中實(shí)體類對(duì)象賦值到表單的實(shí)現(xiàn)代碼
昨天在網(wǎng)上看到了一個(gè)利用反射表單賦值到實(shí)體類對(duì)象的一個(gè)方法,自己就在加了個(gè)方法,從實(shí)體對(duì)象到表單,覺的很不錯(cuò)非常省事,所以把他寫成了一個(gè)類,供以后使用2010-11-11asp.net 網(wǎng)絡(luò)硬盤實(shí)現(xiàn)分析
隨著網(wǎng)絡(luò)技術(shù)的日益普及和信息化建設(shè)的重視,網(wǎng)絡(luò)硬盤作為一種新型安全的網(wǎng)絡(luò)存儲(chǔ)系統(tǒng),已越來越受到人們的重視和喜歡。2011-02-02