.net core中編輯json配置文件的方法

引言

最近在具體項目開發應用中,項目采用的json格式配置文件,配置文件的加載采用的IConfiguration接口對象進行的管理,這是.net standard時代,微軟所提供的現代化的配置管理工具。

項目設計中,需要在運行過程中,將遠程服務端發送過來的配置信息回寫到配置文件中。然而,必應也好,百度也罷,翻遍網絡,這套現代化的配置管理模型中,卻找不到一個可以改變配置回寫的方法。

無奈之下,隻好自己動手,手動造輪子瞭。

.NET Standard時代的配置模型

隨著.NET Standard時代的來臨,System.Configuration在.net core中已經不存在瞭,那麼取而代之的是Microsoft.Extensions.Configuration系列配置管理類庫:

Microsoft.Extensions.Configuration.Abstractions:基礎接口

Microsoft.Extensions.Configuration:實現上面的基礎接口

Microsoft.Extensions.Configuration.FileProviderExtensions:提供重載配置擴展

Microsoft.Extensions.Configuration.Binder:提供轉換到實體功能

Microsoft.Extensions.Configuration.FileExtensions:提供配置文件根路徑擴展

相關文章資源

關於以上類庫的使用,網上有大量相關文章,如知名博主大內老A的文章中,有著系統、詳細闡述,各位可自行查閱。

鏈接在此:https://www.cnblogs.com/artech/p/config-for-net-core.html

配置類的建議用法

出於編程上的便利,我們通常不會直接利用ConfigurationBuilder創建的Configuration對象讀取某個單一配置項的值,而是傾向於將一組相關的配置綁定為一個對象。

例如筆者某個項目消息主題配置參數類如下:

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";
}

我們可以為配置類指定默認參數。

在需要使用配置參數的對象中,我們可以將配置類設置為屬性字段

private TopicConfig topicConfig = new TopicConfig();

當對象類被實例化時,配置類將自動被構造並擁有默認配置參數

我們在需要使用配置的對象類中,寫一個加載配置類的方法和保存配置類的方法,當對象類構造時,調用並執行加載配置文件。

當配置文件存在時,判斷對應的配置段是否存在,如果存在,則綁定到對應的配置類,從而實現配置參數的加載(對象類中,相關需要使用配置參數的地方,直接從配置類的獲取參數);

當配置文件不存在時,加載配置方法調用保存配置方法,將默認配置回寫到配置文件中。

當配置參數動態更新後需要保存時,也通過調用保存配置方法,將配置參數更新到配置文件中。

示例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);//綁定配置數據到配置類
            }
            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);
}

調用json配置保存類,將配置保存到指定的位置。

通用Json配置保存類

筆者針對需要改寫配置文件的應用的需要,自行實現瞭一個保存json格式配置文件的通用類,支持同時保存多個配置類。

支持對現有配置文件節點的改寫和追加配置節點。

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配置文件的詳細內容,更多關於.net core json配置文件的資料請關註WalkonNet其它相關文章!

推薦閱讀: