.net core读取配置文件
admin
2023-06-21 15:44:15

在应用程序开发中,配置文件是主要存储系统的初始配置信息,配置文件的读取虽然属于基础内容却又经常用到,所以百丈高楼平地起,学习.Net Core,就从学习配置文件开始。在.net framework时代,配置文件主要是xml格式【web.config,app.config】,且每次修改,需要重启,但是在.Net Core中,由于跨平台的关系,配置文件多以json【appsetting.json】的形式存在,且可以进行热加载。本文以一些简单的小例子,简述如何在.Net Core中进行配置文件【Json,xml,ini,环境变量等】的读取,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

在本例中,主要进行.Net Core开发环境下的配置文件读取,涉及知识点如下:

  • IConfiguration:.Net Core中应用程序配置的操作接口,主要提供了对Json,xml,ini ,环境变量,内存数据等的读取功能。
  • ConfigurationBuilder:用于构建应用程序配置接口的构建器工具类。

安装插件

在.Net Core中,要实现配置文件的读取,需要依赖以下几个插件包,可以通过Nuget进行安装。具体如下所示:

.net core读取配置文件图1

注意:.Net Core对不同文件的解析,在不同的插件库中,可以根据实际项目需要分别进行安装。此处也体现了面向对象的设计思想【如:开闭原则,单一职责原则】。

读取Json文件

1. 准备数据

首先准备一个Json文件,如下所示:

.net core读取配置文件图2
{ "Name": "Alan.hsiang", "Age": 20, "Sex": "male", "Like": ["basketball","football","swimming"], "Score": { "LandLit": 90, "Mathematics": 99, "English": 50 }}
.net core读取配置文件图3

2. 创建IConfiguration接口实例

在.Net Core中,读取配对文件是通过IConfiguration接口操作的,实例化接口对象如下所示:

1 IConfiguration cOnfiguration= new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("student.json").Build();

3. 通过索引器进行读取

默认情况下,IConfiguration接口提供了索引器,以Key为参数进行读取,返回字符串对象,如下所示:

1 var name = configuration["Name"]; //IConfiguration接口自带的索引器,只返回字符串类型。如:名字2 var like0 = configuration["Like:0"];//读取数组中第一个元素 如:第一个爱好3 var like2 = configuration["Like:2"];//读取数组中第三个元素 如:第三个爱好4 var landLit = configuration["Score:LandLit"];//获取字节点的属性值,如:语文成绩

注意:如果Json数据有层级关系,则通过冒号【:】进行表示。

4. 通过GetValue()方法进行读取

通过索引器只能返回字符串类型的值,如果需要读取其他简单类型的对象,如:int,float等,则可以通过GetValue()方法进行,具体如下所示:

1 var age = configuration.GetValue("Age");//获取其他数据类型,如:int,如:年龄

5. 读取数组

通过索引器和泛型方法,可以读取简单类型的对象,如果需要读取复杂对象【如:数组,列表等】,则需要使用绑定,如下所示:

1 //获取整个数组,如:爱好2 var like = new List();3 configuration.Bind("Like",like);

6. 整体对象绑定

以上示例都是对Json文件局部数据的读取,那么可以将整个文件转换为对象吗?这样直接操作对象将对很方便快捷。具体如下所示:

首先复制整个Json文件的内容,然后依次点击【编辑-->选择性粘贴-->将JSON粘贴为类】菜单,如下所示:

.net core读取配置文件图4

默认生成的类名为RootObject,然后修改为Student,具体如下所示:

.net core读取配置文件图5
 1 namespace DemoCore 2 { 3 public class Student 4 { 5 public string Name { get; set; } 6 public int Age { get; set; } 7 public string Sex { get; set; } 8 public string[] Like { get; set; } 9 public Score Score { get; set; }10 }11 12 public class Score13 {14 public int LandLit { get; set; }15 public int Mathematics { get; set; }16 public int English { get; set; }17 }18 19 }
.net core读取配置文件图6

将Student类和配置对象进行绑定,如下所示:

1 //2. 复杂读取2 var student = new Student();3 configuration.Bind(student);4 Console.WriteLine($"name={student.Name},age={student.Age},like= {string.Join(",", student.Like)},score={student.Score.English}");

7. Json示例截图

.net core读取配置文件图7

读取XML文件

在应用程序开发中,XML文件也是比较常用的一种配置文件。对XML文件的读取操作和Json文件操作基本相似,具体如下所示:

1. 创建XML文件

首先创建一个XML文件,如下所示:

.net core读取配置文件图8
 1  2  3 Alan.hsiang 4 20 5 male 6  7 basketball 8 football 9 swimming10 11 12 9013 9814 6015 16 
.net core读取配置文件图9

2. 简单读取

通过索引器和GetValue可以进行读取,如下所示:

.net core读取配置文件图10
1 //1. 基础读取2 3 var age = configuration.GetValue("Age");//获取其他数据类型,如:int,如:年龄4 var name = configuration["Name"]; //IConfiguration接口自带的索引器,只返回字符串类型。如:名字5 var like0 = configuration["Likes:Like:0"];//读取数组中第一个元素 如:第一个爱好6 var like2 = configuration["Likes:Like:2"];//读取数组中第三个元素 如:第三个爱好7 var landLit = configuration["Score:LandLit"];//获取字节点的属性值,如:语文成绩
.net core读取配置文件图11

注意:读取数组中的元素时,和json读取不同,因为json中是一个节点,但是在xml中是三个节点。

3. 读取数组

读取XML中的数组列表,如下所示:

1 //获取整个数组,如:爱好2 var like = new List();3 configuration.Bind("Likes:Like", like);4 Console.WriteLine($"name={name},age={age},like= {string.Join(",", like)}");

4. 整体绑定对象

以上示例都是对XML文件局部数据的读取,那么可以将整个文件转换为对象吗?这样直接操作对象将对很方便快捷。具体如下所示:

首先复制整个XML文件的内容,然后依次点击【编辑-->选择性粘贴-->将XML粘贴为类】菜单,如下所示:

.net core读取配置文件图12

默认生成的类,类名与XML的根节点保持一致,如下所示:

.net core读取配置文件图13
 1 namespace DemoCore 2 { 3 // 注意: 生成的代码可能至少需要 .NET Framework 4.5 或 .NET Core/Standard 2.0。 4 ///  5 [System.SerializableAttribute()] 6 [System.ComponentModel.DesignerCategoryAttribute("code")] 7 [System.Xml.Serialization.XmlTypeAttribute(AnOnymousType= true)] 8 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 9 public partial class Student 10 { 11 12 private string nameField; 13 14 private byte ageField; 15 16 private string sexField; 17 18 private string[] likesField; 19 20 private StudentScore scoreField; 21 22 ///  23 public string Name 24 { 25 get 26 { 27 return this.nameField; 28 } 29 set 30 { 31 this.nameField = value; 32 } 33 } 34 35 ///  36 public byte Age 37 { 38 get 39 { 40 return this.ageField; 41 } 42 set 43 { 44 this.ageField = value; 45 } 46 } 47 48 ///  49 public string Sex 50 { 51 get 52 { 53 return this.sexField; 54 } 55 set 56 { 57 this.sexField = value; 58 } 59 } 60 61 ///  62 [System.Xml.Serialization.XmlArrayItemAttribute("Like", IsNullable = false)] 63 public string[] Likes 64 { 65 get 66 { 67 return this.likesField; 68 } 69 set 70 { 71 this.likesField = value; 72 } 73 } 74 75 ///  76 public StudentScore Score 77 { 78 get 79 { 80 return this.scoreField; 81 } 82 set 83 { 84 this.scoreField = value; 85 } 86 } 87 } 88 89 ///  90 [System.SerializableAttribute()] 91 [System.ComponentModel.DesignerCategoryAttribute("code")] 92 [System.Xml.Serialization.XmlTypeAttribute(AnOnymousType= true)] 93 public partial class StudentScore 94 { 95 96 private byte landLitField; 97 98 private byte mathematicsField; 99 100 private byte englishField;101 102 /// 103 public byte LandLit104 {105 get106 {107 return this.landLitField;108 }109 set110 {111 this.landLitField = value;112 }113 }114 115 /// 116 public byte Mathematics117 {118 get119 {120 return this.mathematicsField;121 }122 set123 {124 this.mathematicsField = value;125 }126 }127 128 /// 129 public byte English130 {131 get132 {133 return this.englishField;134 }135 set136 {137 this.englishField = value;138 }139 }140 }141 142 143 }
.net core读取配置文件图14

但是默认生成的类,在转换成数组时存在问题,所以需要细微调整,如下所示:

.net core读取配置文件图15
 1 namespace DemoCore 2 { 3 // 注意: 生成的代码可能至少需要 .NET Framework 4.5 或 .NET Core/Standard 2.0。 4 ///  5 [System.SerializableAttribute()] 6 [System.ComponentModel.DesignerCategoryAttribute("code")] 7 [System.Xml.Serialization.XmlTypeAttribute(AnOnymousType= true)] 8 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 9 public partial class Student 10 { 11 12 private string nameField; 13 14 private byte ageField; 15 16 private string sexField; 17 18 private LikesLike likesField; 19 20 private StudentScore scoreField; 21 22 ///  23 public string Name 24 { 25 get 26 { 27 return this.nameField; 28 } 29 set 30 { 31 this.nameField = value; 32 } 33 } 34 35 ///  36 public byte Age 37 { 38 get 39 { 40 return this.ageField; 41 } 42 set 43 { 44 this.ageField = value; 45 } 46 } 47 48 ///  49 public string Sex 50 { 51 get 52 { 53 return this.sexField; 54 } 55 set 56 { 57 this.sexField = value; 58 } 59 } 60 61 ///  62 [System.Xml.Serialization.XmlArrayItemAttribute("Like", IsNullable = false)] 63 public LikesLike Likes 64 { 65 get 66 { 67 return this.likesField; 68 } 69 set 70 { 71 this.likesField = value; 72 } 73 } 74 75 ///  76 public StudentScore Score 77 { 78 get 79 { 80 return this.scoreField; 81 } 82 set 83 { 84 this.scoreField = value; 85 } 86 } 87 } 88 89 ///  90 [System.SerializableAttribute()] 91 [System.ComponentModel.DesignerCategoryAttribute("code")] 92 [System.Xml.Serialization.XmlTypeAttribute(AnOnymousType= true)] 93 public partial class StudentScore 94 { 95 96 private byte landLitField; 97 98 private byte mathematicsField; 99 100 private byte englishField;101 102 /// 103 public byte LandLit104 {105 get106 {107 return this.landLitField;108 }109 set110 {111 this.landLitField = value;112 }113 }114 115 /// 116 public byte Mathematics117 {118 get119 {120 return this.mathematicsField;121 }122 set123 {124 this.mathematicsField = value;125 }126 }127 128 /// 129 public byte English130 {131 get132 {133 return this.englishField;134 }135 set136 {137 this.englishField = value;138 }139 }140 }141 142 public partial class LikesLike { 143 public string[] Like { get; set; }144 }145 }
.net core读取配置文件图16

然后在读取时,进行整体绑定,如下所示:

1 //2. 复杂读取2 var student = new Student();3 configuration.Bind(student);4 Console.WriteLine($"name={student.Name},age={student.Age},like= {string.Join(",", student.Likes.Like)},score={student.Score.English}");

5. 示例截图

.net core读取配置文件图17

注意:通过示例方向,读取XML和读取Json文件,存在细微的差异。

读取INI文件

ini文件在C#程序中,一般应用的不是很多,主要是键值对文件,主要用于存储简单的数据格式,如下所示:

1. 创建ini文件

一般情况下,ini文件包括以下几个部分:a. 注释 用分号做前缀,b. 节点用中括号表示,c. key=value表示内容。如下所示:

1 ;此处表示注释 2 [student]3 Name=Alan.hsiang4 Age=205 Grade=4

2. 创建配置并读取

在.Net Core中读取ini文件的步骤,非常简单,如下所示:

.net core读取配置文件图18
1 private static void ReadIni() {2 IConfiguration cOnfiguration= new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddIniFile("student.ini").Build();3 string name = configuration["student:Name"];//如果没有节点,则直接用key进行获取即可4 var age = configuration.GetValue("student:Age");5 var grade = configuration.GetValue("student:Grade");6 Console.WriteLine($"name={name},age={age},grade= {string.Join(",", grade)}");7 }
.net core读取配置文件图19

注意:由于ini文件不涉及复杂的数据结构,所以直接通过索引器和GetValue即可。

3. 示例截图

读取ini文件的示例截图如下所示:

.net core读取配置文件图20

读取环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用这当然和具体的环境变量相关。

1. 查看环境变量

在win10操作系统中,此电脑-->右键-->属性-->高级系统设置-->环境变量-->然后打开环境变量对话框。如下所示:

.net core读取配置文件图21

环境变量分为用户变量【当前用户】,和系统变量【全部用户】,如下所示:

.net core读取配置文件图22

2. 简单读取

在.NetCore中读取环境变量的值,如下所示:

.net core读取配置文件图23
 1 private static void ReadEnvironmentVariable() { 2 IConfiguration cOnfiguration= new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddEnvironmentVariables().Build(); 3 var path = configuration["Path"]; 4 var temp = configuration["TEMP"]; 5 var os = configuration["OS"]; 6 var arr = path.Split(";"); 7 Console.WriteLine("path:"); 8 foreach (var a in arr) 9 {10 Console.WriteLine(a);11 }12 Console.WriteLine($"temp={temp}\n os= {os}");13 }
.net core读取配置文件图24

3. 示例截图

读取环境变量示例截图如下所示:

.net core读取配置文件图25

备注

以上是在.Net Core中读取几种常见数据的方式,旨在抛砖引玉,共同学习,一起进步。

相关内容

热门资讯

长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...