在應用程序開發中,配置文件是主要存儲系統的初始配置信息,配置文件的讀取雖然屬於基礎內容卻又經常用到,所以百丈高樓平地起,學習.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中讀取幾種常見數據的方式,旨在拋磚引玉,共同學習,一起進步。
千秋歲·數聲鶗鴂【作者】張先
莫把幺弦撥。怨極弦能說。天不老,情難絕。心似雙絲網,中有千千結。夜過也,東窗未白凝殘月。