在应用程序开发中,配置文件是主要存储系统的初始配置信息,配置文件的读取虽然属于基础内容却又经常用到,所以百丈高楼平地起,学习.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对不同文件的解析,在不同的插件库中,可以根据实际项目需要分别进行安装。此处也体现了面向对象的设计思想【如:开闭原则,单一职责原则】。
读取Json文件1. 准备数据首先准备一个Json文件,如下所示:
{
"Name": "Alan.hsiang",
"Age": 20,
"Sex": "male",
"Like": ["basketball","football","swimming"],
"Score": {
"LandLit": 90,
"Mathematics": 99,
"English": 50
}
}
2. 创建IConfiguration接口实例
在.Net Core中,读取配对文件是通过IConfiguration接口操作的,实例化接口对象如下所示:
1 IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("student.json").Build();
默认情况下,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<T>()方法进行读取通过索引器只能返回字符串类型的值,如果需要读取其他简单类型的对象,如:int,float等,则可以通过GetValue<T>()方法进行,具体如下所示:
1 var age = configuration.GetValue<int>("Age");//获取其他数据类型,如:int,如:年龄
通过索引器和泛型方法,可以读取简单类型的对象,如果需要读取复杂对象【如:数组,列表等】,则需要使用绑定,如下所示:
1 //获取整个数组,如:爱好
2 var like = new List<string>();
3 configuration.Bind("Like",like);
以上示例都是对Json文件局部数据的读取,那么可以将整个文件转换为对象吗?这样直接操作对象将对很方便快捷。具体如下所示:
首先复制整个Json文件的内容,然后依次点击【编辑-->选择性粘贴-->将JSON粘贴为类】菜单,如下所示:
默认生成的类名为RootObject,然后修改为Student,具体如下所示:
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 Score
13 {
14 public int LandLit { get; set; }
15 public int Mathematics { get; set; }
16 public int English { get; set; }
17 }
18
19 }
将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}");
读取XML文件
在应用程序开发中,XML文件也是比较常用的一种配置文件。对XML文件的读取操作和Json文件操作基本相似,具体如下所示:
1. 创建XML文件首先创建一个XML文件,如下所示:
1 <?xml version="1.0" encoding="utf-8" ?>
2 <Student>
3 <Name>Alan.hsiang</Name>
4 <Age>20</Age>
5 <Sex>male</Sex>
6 <Likes>
7 <Like>basketball</Like>
8 <Like>football</Like>
9 <Like>swimming</Like>
10 </Likes>
11 <Score>
12 <LandLit>90</LandLit>
13 <Mathematics>98</Mathematics>
14 <English>60</English>
15 </Score>
16 </Student>
2. 简单读取
通过索引器和GetValue可以进行读取,如下所示:
1 //1. 基础读取
2
3 var age = configuration.GetValue<int>("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"];//获取字节点的属性值,如:语文成绩
注意:读取数组中的元素时,和json读取不同,因为json中是一个节点,但是在xml中是三个节点。
3. 读取数组读取XML中的数组列表,如下所示:
1 //获取整个数组,如:爱好
2 var like = new List<string>();
3 configuration.Bind("Likes:Like", like);
4 Console.WriteLine($"name={name},age={age},like= {string.Join(",", like)}");
以上示例都是对XML文件局部数据的读取,那么可以将整个文件转换为对象吗?这样直接操作对象将对很方便快捷。具体如下所示:
首先复制整个XML文件的内容,然后依次点击【编辑-->选择性粘贴-->将XML粘贴为类】菜单,如下所示:
默认生成的类,类名与XML的根节点保持一致,如下所示:
1 namespace DemoCore
2 {
3 // 注意: 生成的代码可能至少需要 .NET Framework 4.5 或 .NET Core/Standard 2.0。
4 /// <remarks/>
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 /// <remarks/>
23 public string Name
24 {
25 get
26 {
27 return this.nameField;
28 }
29 set
30 {
31 this.nameField = value;
32 }
33 }
34
35 /// <remarks/>
36 public byte Age
37 {
38 get
39 {
40 return this.ageField;
41 }
42 set
43 {
44 this.ageField = value;
45 }
46 }
47
48 /// <remarks/>
49 public string Sex
50 {
51 get
52 {
53 return this.sexField;
54 }
55 set
56 {
57 this.sexField = value;
58 }
59 }
60
61 /// <remarks/>
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 /// <remarks/>
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 /// <remarks/>
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 /// <remarks/>
103 public byte LandLit
104 {
105 get
106 {
107 return this.landLitField;
108 }
109 set
110 {
111 this.landLitField = value;
112 }
113 }
114
115 /// <remarks/>
116 public byte Mathematics
117 {
118 get
119 {
120 return this.mathematicsField;
121 }
122 set
123 {
124 this.mathematicsField = value;
125 }
126 }
127
128 /// <remarks/>
129 public byte English
130 {
131 get
132 {
133 return this.englishField;
134 }
135 set
136 {
137 this.englishField = value;
138 }
139 }
140 }
141
142
143 }
但是默认生成的类,在转换成数组时存在问题,所以需要细微调整,如下所示:
1 namespace DemoCore
2 {
3 // 注意: 生成的代码可能至少需要 .NET Framework 4.5 或 .NET Core/Standard 2.0。
4 /// <remarks/>
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 /// <remarks/>
23 public string Name
24 {
25 get
26 {
27 return this.nameField;
28 }
29 set
30 {
31 this.nameField = value;
32 }
33 }
34
35 /// <remarks/>
36 public byte Age
37 {
38 get
39 {
40 return this.ageField;
41 }
42 set
43 {
44 this.ageField = value;
45 }
46 }
47
48 /// <remarks/>
49 public string Sex
50 {
51 get
52 {
53 return this.sexField;
54 }
55 set
56 {
57 this.sexField = value;
58 }
59 }
60
61 /// <remarks/>
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 /// <remarks/>
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 /// <remarks/>
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 /// <remarks/>
103 public byte LandLit
104 {
105 get
106 {
107 return this.landLitField;
108 }
109 set
110 {
111 this.landLitField = value;
112 }
113 }
114
115 /// <remarks/>
116 public byte Mathematics
117 {
118 get
119 {
120 return this.mathematicsField;
121 }
122 set
123 {
124 this.mathematicsField = value;
125 }
126 }
127
128 /// <remarks/>
129 public byte English
130 {
131 get
132 {
133 return this.englishField;
134 }
135 set
136 {
137 this.englishField = value;
138 }
139 }
140 }
141
142 public partial class LikesLike {
143 public string[] Like { get; set; }
144 }
145 }
然后在读取时,进行整体绑定,如下所示:
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}");
注意:通过示例方向,读取XML和读取Json文件,存在细微的差异。
读取INI文件ini文件在C#程序中,一般应用的不是很多,主要是键值对文件,主要用于存储简单的数据格式,如下所示:
1. 创建ini文件一般情况下,ini文件包括以下几个部分:a. 注释 用分号做前缀,b. 节点用中括号表示,c. key=value表示内容。如下所示:
1 ;此处表示注释
2 [student]
3 Name=Alan.hsiang
4 Age=20
5 Grade=4
在.Net Core中读取ini文件的步骤,非常简单,如下所示:
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<int>("student:Age");
5 var grade = configuration.GetValue<int>("student:Grade");
6 Console.WriteLine($"name={name},age={age},grade= {string.Join(",", grade)}");
7 }
注意:由于ini文件不涉及复杂的数据结构,所以直接通过索引器和GetValue即可。
3. 示例截图读取ini文件的示例截图如下所示:
读取环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用这当然和具体的环境变量相关。
1. 查看环境变量在win10操作系统中,此电脑-->右键-->属性-->高级系统设置-->环境变量-->然后打开环境变量对话框。如下所示:
环境变量分为用户变量【当前用户】,和系统变量【全部用户】,如下所示:
2. 简单读取
在.NetCore中读取环境变量的值,如下所示:
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 }
3. 示例截图
读取环境变量示例截图如下所示:
备注
以上是在.Net Core中读取几种常见数据的方式,旨在抛砖引玉,共同学习,一起进步。
,