当前位置 博文首页 > 文章内容

    .net core中编辑json配置文件的方法

    作者:shunshunshun18 栏目:未分类 时间:2021-06-19 14:43:30

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    引言

    最近在具体项目开发应用中,项目采用的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配置文件的资料请关注IIS7站长之家博文其它相关文章!