ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.net core之编辑json配置文件

2020-01-31 13:00:55  阅读:215  来源: 互联网

标签:core 配置文件 配置 json path using net Configuration


 .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对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象。

例如笔者某个项目消息主题配置参数类如下:

1 public class TopicConfig
2 {
3         public string Project { get; set; } ="ibms";
4         public string Device { get; set; } = "gateway";
5         public string City { get; set; } = "wuhan";
6         public string Area { get; set; } = "poly";   
7 }
View Code

我们可以为配置类指定默认参数。

在需要使用配置参数的对象中,我们可以将配置类设置为属性字段

 

private TopicConfig topicConfig = new TopicConfig();

 

当对象类被实例化时,配置类将自动被构造并拥有默认配置参数

我们在需要使用配置的对象类中,写一个加载配置类的方法和保存配置类的方法,当对象类构造时,调用并执行加载配置文件。

当配置文件存在时,判断对应的配置段是否存在,如果存在,则绑定到对应的配置类,从而实现配置参数的加载(对象类中,相关需要使用配置参数的地方,直接从配置类的获取参数);

当配置文件不存在时,加载配置方法调用保存配置方法,将默认配置回写到配置文件中。

当配置参数动态更新后需要保存时,也通过调用保存配置方法,将配置参数更新到配置文件中。

 

示例json配置文件

{
    "topic": {
        "Project": "ibms",
        "Device": "gateway",
        "City": "wuhan",
        "Area": "poly"
    }
}

 

加载配置方法

   笔者采用程序目录下的"appsettings.json"文件作为配置文件

 1        private void LoadConfig()
 2         {
 3             var path = Directory.GetCurrentDirectory();
 4             var config_file = "appsettings.json";
 5             var full_path = Path.Combine(path, config_file);
 6             if (File.Exists(full_path))
 7             {
 8                 var builder = new ConfigurationBuilder()
 9                     .SetBasePath(path)
10                     .AddJsonFile("appsettings.json");
11 
12                 IConfiguration Configuration = builder.Build();
13 
14                 if (Configuration.GetSection(Topic).Exists())//Topic为字符串常量,对应配置段属性名称
15                     Configuration.GetSection(Topic).Bind(topicConfig);//绑定配置数据到配置类
16             }
17             else
18             {
19                 SaveConfig();
20             }
21      }
View Code

 

在dotnet core由于采用了更为模块化的设计方式,使用配置类需要引用相应的程序包,我们在程序中使用json配置,需要安装Microsoft.Extensions.Configuration.Json程序包。

Bind方法为扩展方法,需要项目中先安装Microsoft.Extensions.Configuration.Binder程序包。

程序包可通过Nuget包管理器进行安装。

 

保存配置方法  

1 private void SaveConfig(string path = "")
2 {
3         if (path == "") path = Directory.GetCurrentDirectory();
4         Dictionary<string, object> sectionsInfo = new Dictionary<string, object>();
5 
6         sectionsInfo.Add(Topic, topicConfig); //Topic为字符串常量,对应配置段属性名称
7         JsonConfigHelper.SaveJson(sectionsInfo, path);
8 }
9             
View Code

调用json配置保存类,将配置保存到指定的位置。

 

通用Json配置保存类

笔者针对需要改写配置文件的应用的需要,自行实现了一个保存json格式配置文件的通用类,支持同时保存多个配置类。

支持对现有配置文件节点的改写和追加配置节点。

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.IO;
 4 using Newtonsoft.Json;
 5 using Newtonsoft.Json.Linq;
 6 
 7 namespace flyfire.Common
 8 {
 9     public class JsonConfigHelper
10     {
11         public static bool SaveJson(Dictionary<string,object> sectionInfo, string configFilePath, string configFileName = "appsettings.json")
12         {
13             if (sectionInfo.Count==0)
14                 return false;
15 
16             try
17             {
18                 var filePath = Path.Combine(configFilePath, configFileName);
19                 JObject jsonObject;
20 
21                 if (File.Exists(filePath))
22                 {
23                     using (StreamReader file = new StreamReader(filePath))
24                     {
25                         using (JsonTextReader reader = new JsonTextReader(file))
26                         {
27                             jsonObject = (JObject)JToken.ReadFrom(reader);
28                         }
29                     }
30                 }
31                 else
32                 {
33                     jsonObject = new JObject();
34                 }
35 
36                 foreach (var key in sectionInfo.Keys)
37                 {
38                     jsonObject[key] = JObject.FromObject(sectionInfo[key]);
39                 }
40 
41                 using (var writer = new StreamWriter(filePath))
42                 using (JsonTextWriter jsonwriter = new JsonTextWriter(writer)
43                 {
44                     Formatting = Formatting.Indented,//格式化缩进
45                     Indentation = 4,  //缩进四个字符
46                     IndentChar = ' '  //缩进的字符是空格
47                 })
48                 {
49                     jsonObject.WriteTo(jsonwriter);
50                     return true;
51                 }
52             }
53             catch (Exception)
54             {
55                 return false;
56             }
57         }
58     }
59 }
View Code

 

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

 

标签:core,配置文件,配置,json,path,using,net,Configuration
来源: https://www.cnblogs.com/flyfire-cn/p/12245041.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有