.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==)
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 = , //缩进四个字符
IndentChar = ' ' //缩进的字符是空格
})
{
jsonObject.WriteTo(jsonwriter);
return true;
}
}
catch (Exception)
{
return false;
}
}
}
}

至此,我们完成了Json格式配置文件的加载、绑定与保存。

.net core之编辑json配置文件的更多相关文章

  1. [.NET Core] 简单读取 json 配置文件

    简单读取 json 配置文件 背景 目前发现网上的 .NET Core 读取配置文件有点麻烦,自己想搞个简单点的. .NET Core 已经不使用之前的诸如 app.config 和 web.conf ...

  2. Asp .Net Core 读取appsettings.json配置文件

         Asp .Net Core 如何读取appsettings.json配置文件?最近也有学习到如何读取配置文件的,主要是通过 IConfiguration,以及在Program中初始化完成的. ...

  3. 【NET Core】.NET Core中读取json配置文件

    在.NET Framework框架下应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别用 Sy ...

  4. .net core mvc appsettings.json配置文件的使用

    配置文件的使用主要是两种用法 1.直接使用弱类型的数据 2.使用强类型的数据 (将配置的数据映射到类) 直接使用弱类型的数据  在appsetings.json文件中先新建两个节点 TestObj节点 ...

  5. ASP.NET Core读取appsettings.json配置文件信息

    1.在配置文件appsettings.json里新增AppSettings节点 { "Logging": { "LogLevel": { "Defau ...

  6. asp.net core 读取Appsettings.json 配置文件

    Appsettingsjson 配置定义实体在StartUp时读取配置信息修改你的Controller通过构造函数进入配置信息总结Appsettings.json 配置很明显这个配置文件就是一个jso ...

  7. net core 简单读取json配置文件

    //添加 json 文件路径 var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()) ...

  8. .net core 读取、修改配置文件appsettings.json

    .net core 设置读取JSON配置文件 appsettings.json Startup.cs 中 public class Startup { public Startup(IHostingE ...

  9. 干货:.net core实现读取appsettings.json配置文件(建议收藏)

    看好多人不懂在.NET CORE中如何读取配置文件,我这里分两篇,这一篇介绍怎样通过appsettings.json配置读取文件信息.这里我会教大家两种方式: 第一种直接放到通用类库,那里想调往那调. ...

随机推荐

  1. <QluOJ2018NewCode>计算几何(寄蒜几盒)

    题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Yes"(不含引号 ...

  2. 【GYM101409】2010-2011 ACM-ICPC, NEERC, Western Subregional Contest

    A-Area and Circumference 题目大意:在平面上给出$N$个三角形,问周长和面积比的最大值. #include <iostream> #include <algo ...

  3. LuoguP3066 逃跑的BarnRunning Away From…

    LuoguP3066 先吐槽一下,这道题名字好长啊 一个非常明显的思路,利用倍增数组不断向上跳.直到数值大于\(L\),然后直接差分统计答案就好了. 这种ZROI也考过,不多赘述了. 我们来考虑主席树 ...

  4. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  5. javascript 闭包的理解(一)

    过很多谈如何理解闭包的方法,但大多数文章,都是照抄或者解释<Javascript高级程序设计(第三版)>对于闭包的讲解,甚至例程都不约而同的引用高程三181页‘闭包与变量’一节的那个“返回 ...

  6. Visio图表应用

    两种方式创建 插入图表之后通过设计面板的更改图表类型进行更改 双击图表进入编辑状态. 组合其中组合图的利用 下面是图表编辑操作: 双击进入图表之后下方会有“Chart1”跟“Sheet1”两个板块 而 ...

  7. PRML第一章读书小结

    PRML第一章读书小结     第一章用例子出发,较为简单的引入了概率论.模型.决策.损失.信息论的问题,作为机器学习从业者,读PRML除了巩固已有基础,还受到了很多新的启发,下面将我收到的启发总结如 ...

  8. 【一起学源码-微服务】Nexflix Eureka 源码八:EurekaClient注册表抓取 精妙设计分析!

    前言 前情回顾 上一讲 我们通过单元测试 来梳理了EurekaClient是如何注册到server端,以及server端接收到请求是如何处理的,这里最重要的关注点是注册表的一个数据结构:Concurr ...

  9. jsqlparser和calcite和druid功能对比

    需求分析:(用其它方法替代metabase中的某些功能)功能1.通过对sql查询语句的分析,得到所有表名,以及所有表的字段名,字段类型,字段注解信息.功能2.在sql语句执行查询前,校验sql语句是否 ...

  10. easyUI dataGrid主从表点击展开问题

    昨天在公司写代码遇到了一个问题,就是在用easyUI做主从表的时候在查询之后点击展开的时候不能再次展开了.先说一下主从表我也是第一次用 效果如下图: 然后点击前面的小加号出现以下效果: 然而遇到了一个 ...