.net core中編輯json配置文件的方法
引言
最近在具體項目開發(fā)應用中,項目采用的json格式配置文件,配置文件的加載采用的IConfiguration接口對象進行的管理,這是.net standard時代,微軟所提供的現(xiàn)代化的配置管理工具。
項目設計中,需要在運行過程中,將遠程服務端發(fā)送過來的配置信息回寫到配置文件中。然而,必應也好,百度也罷,翻遍網(wǎng)絡,這套現(xiàn)代化的配置管理模型中,卻找不到一個可以改變配置回寫的方法。
無奈之下,只好自己動手,手動造輪子了。
.NET Standard時代的配置模型
隨著.NET Standard時代的來臨,System.Configuration在.net core中已經(jīng)不存在了,那么取而代之的是Microsoft.Extensions.Configuration系列配置管理類庫:
Microsoft.Extensions.Configuration.Abstractions:基礎接口
Microsoft.Extensions.Configuration:實現(xiàn)上面的基礎接口
Microsoft.Extensions.Configuration.FileProviderExtensions:提供重載配置擴展
Microsoft.Extensions.Configuration.Binder:提供轉換到實體功能
Microsoft.Extensions.Configuration.FileExtensions:提供配置文件根路徑擴展
相關文章資源
關于以上類庫的使用,網(wǎng)上有大量相關文章,如知名博主大內(nèi)老A的文章中,有著系統(tǒng)、詳細闡述,各位可自行查閱。
鏈接在此:https://www.cnblogs.com/artech/p/config-for-net-core.html
配置類的建議用法
出于編程上的便利,我們通常不會直接利用ConfigurationBuilder創(chuàng)建的Configuration對象讀取某個單一配置項的值,而是傾向于將一組相關的配置綁定為一個對象。
例如筆者某個項目消息主題配置參數(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";
}
我們可以為配置類指定默認參數(shù)。
在需要使用配置參數(shù)的對象中,我們可以將配置類設置為屬性字段
private TopicConfig topicConfig = new TopicConfig();
當對象類被實例化時,配置類將自動被構造并擁有默認配置參數(shù)
我們在需要使用配置的對象類中,寫一個加載配置類的方法和保存配置類的方法,當對象類構造時,調(diào)用并執(zhí)行加載配置文件。
當配置文件存在時,判斷對應的配置段是否存在,如果存在,則綁定到對應的配置類,從而實現(xiàn)配置參數(shù)的加載(對象類中,相關需要使用配置參數(shù)的地方,直接從配置類的獲取參數(shù));
當配置文件不存在時,加載配置方法調(diào)用保存配置方法,將默認配置回寫到配置文件中。
當配置參數(shù)動態(tài)更新后需要保存時,也通過調(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為字符串常量,對應配置段屬性名稱
Configuration.GetSection(Topic).Bind(topicConfig);//綁定配置數(shù)據(jù)到配置類
}
else
{
SaveConfig();
}
}
在dotnet core由于采用了更為模塊化的設計方式,使用配置類需要引用相應的程序包,我們在程序中使用json配置,需要安裝Microsoft.Extensions.Configuration.Json程序包。
Bind方法為擴展方法,需要項目中先安裝Microsoft.Extensions.Configuration.Binder程序包。
程序包可通過Nuget包管理器進行安裝。
保存配置方法
private void SaveConfig(string path = "")
{
if (path == "") path = Directory.GetCurrentDirectory();
Dictionary<string, object> sectionsInfo = new Dictionary<string, object>();
sectionsInfo.Add(Topic, topicConfig); //Topic為字符串常量,對應配置段屬性名稱
JsonConfigHelper.SaveJson(sectionsInfo, path);
}
調(diào)用json配置保存類,將配置保存到指定的位置。
通用Json配置保存類
筆者針對需要改寫配置文件的應用的需要,自行實現(xiàn)了一個保存json格式配置文件的通用類,支持同時保存多個配置類。
支持對現(xiàn)有配置文件節(jié)點的改寫和追加配置節(jié)點。
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,//格式化縮進
Indentation = 4, //縮進四個字符
IndentChar = ' ' //縮進的字符是空格
})
{
jsonObject.WriteTo(jsonwriter);
return true;
}
}
catch (Exception)
{
return false;
}
}
}
}
至此,我們完成了Json格式配置文件的加載、綁定與保存。
以上就是.net core中編輯json配置文件的詳細內(nèi)容,更多關于.net core json配置文件的資料請關注腳本之家其它相關文章!
相關文章
用.NET 2.0壓縮/解壓功能處理大型數(shù)據(jù)
用.NET 2.0壓縮/解壓功能處理大型數(shù)據(jù)...2006-09-09
Asp.net 通用萬級數(shù)據(jù)分頁代碼[修正下載地址]
在萬級數(shù)據(jù)量下的分頁代碼2008-10-10
.NET Core利用swagger進行API接口文檔管理的方法詳解
這篇文章主要給大家介紹了關于.NET Core利用swagger進行API接口文檔管理的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-03-03
ASP.Net Core(C#)創(chuàng)建Web站點的實現(xiàn)
本文主要介紹了ASP.Net Core(C#)創(chuàng)建Web站點的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
ajaxToolkit:ModalPopupExtender演示及實現(xiàn)代碼
ajaxToolkit:ModalPopupExtender可以讓用戶模擬新開一個窗口,就是在模擬新開窗口作多項選項的功能,感興趣的朋友可以了解下,希望此文對你有所幫助2013-01-01

