.NetCore基礎之讀取配置文件


在應用程序開發中,配置文件是主要存儲系統的初始配置信息,配置文件的讀取雖然屬於基礎內容卻又經常用到,所以百丈高樓平地起,學習.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();

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<T>()方法進行讀取

通過索引器只能返回字符串類型的值,如果需要讀取其他簡單類型的對象,如:int,float等,則可以通過GetValue<T>()方法進行,具體如下所示:

1 var age = configuration.GetValue<int>("Age");//獲取其他數據類型,如:int,如:年齡

5. 讀取數組

通過索引器和泛型方法,可以讀取簡單類型的對象,如果需要讀取復雜對象【如:數組,列表等】,則需要使用綁定,如下所示:

1 //獲取整個數組,如:愛好
2 var like = new List<string>();
3 configuration.Bind("Like",like);

6. 整體對象綁定

以上示例都是對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}");

7. Json示例截圖

 

讀取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)}");

4. 整體綁定對象

以上示例都是對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}");

5. 示例截圖

 

 注意:通過示例方向,讀取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

2. 創建配置並讀取

在.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中讀取幾種常見數據的方式,旨在拋磚引玉,共同學習,一起進步。

千秋歲·數聲鶗鴂【作者】張先 【朝代】宋

  數聲鶗鴂。又報芳菲歇。惜春更把殘紅折。雨輕風色暴,梅子青時節。永豐柳,無人盡日飛花雪。

莫把幺弦撥。怨極弦能說。天不老,情難絕。心似雙絲網,中有千千結。夜過也,東窗未白凝殘月。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM