本篇接着介紹 JSON 的序列化和反序列化。
一、要完成的功能如下:
1 . 序列化:實例化 Company 和 User 對象,並序列化成一個JSON字符串,對應終結點為 JsonDemo6( ) 。
2 . 反序列化:讀取配置文件appcom.json中的信息,並反序列化成 Company 和 User 對象,對應終結點為 JsonDemo7() 。
二、准備工作,給 Company.cs 和 User.cs 類加上相關屬性:
Company.cs 代碼如下:
namespace webapidemo2 { public class Company { public string CompanyName{ get; set; } public string Website { get; set; } public string Address { get; set; } public User Boss { get; set; } public string[] PhoneNumber { get; set; } public List<User> Employees { get; set; } } }
User.cs 代碼如下:
namespace webapidemo2 { public class User { public int UserId { get; set; } public string UserName { get; set; } public string Mobile { get; set; } } }
三、編碼,2個終結點代碼如下。
6 . 終結點: JsonDemo6(); 實現序列化。
[Route("json6")] [HttpGet] public string Demo6() { //mock company和user實例數據; User boss = new User { UserId = 1001, UserName = "王五", Mobile = "13300047775" }; List<User> employees = new List<User>(); employees.Add(new User { UserId = 2113, UserName = "張三", Mobile = "13378465709" }); employees.Add(new User { UserId = 3266, UserName = "李四", Mobile = "13378465709" }); Company company = new Company { CompanyName = "top", Website = "www.xxxx.com", Address = "開曼群島", PhoneNumber = new string[] { "010-93847485", "15890276458" }, Boss = boss, Employees = employees }; //調用 JsonSerializer 的 Serialize() 函數即可將實例序列化成JSON字符串 string str = JsonSerializer.Serialize<Company>(company); return str; }
打開 POSTMAN ,用 GET 方式訪問網址:http://localhost:61946/api/jsondemo/json6 得到如下結果:
可以看到大部分內容序列化出來了,但中文字符被轉義了,沒有正常顯示出來,字符內容也沒有格式化,
所以我們在調用 JsonSerializer.Serialize( ) 方法的時候要傳入 Options 對象來指定序列化時候的編碼和格式,
修改后的方法如下(見紅色代碼部分):
[Route("json6")] [HttpGet] public string Demo6() { //mock company和user實例數據; User boss = new User { UserId = 1001, UserName = "王五", Mobile = "13300047775" }; List<User> employees = new List<User>(); employees.Add(new User { UserId = 2113, UserName = "張三", Mobile = "13378465709" }); employees.Add(new User { UserId = 3266, UserName = "李四", Mobile = "13378465709" }); Company company = new Company { CompanyName = "top", Website = "www.xxxx.com", Address = "開曼群島", PhoneNumber = new string[] { "010-93847485", "15890276458" }, Boss = boss, Employees = employees }; //指定Unicode的碼位范圍 TextEncoderSettings setting = new TextEncoderSettings( UnicodeRanges.BasicLatin, //獲取基本拉丁語 Unicode 塊 (U+0021-U+007F) UnicodeRanges.CjkUnifiedIdeographs //獲取 CJK 統一漢字 Unicode 塊 (U+4E00-U+9FCC) ); JsonSerializerOptions options = new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(setting), //設置字符編碼 WriteIndented = true //是否格式化 }; //調用 JsonSerializer 的 Serialize() 函數即可將實例序列化成JSON字符串 string str = JsonSerializer.Serialize<Company>(company, options); return str; }
編譯項目后再次訪問網址:http://localhost:61946/api/jsondemo/json6 得到如下期望的結果:
7 . 終結點: JsonDemo7(); 實現反序列化。
[Route("json7")] [HttpGet] public string Demo7() { //讀取 appcom.json 文件中的內容反序列化到 Company.cs中 string filePath = Path.GetFullPath("./appcom.json"); byte[] contents = System.IO.File.ReadAllBytes(filePath); ReadOnlySpan<byte> span = contents.AsSpan<byte>(); //調用 JsonSerializer 的 Deserialize( ) 即可實現反序列化 Company company = JsonSerializer.Deserialize<Company>(span); //輸出 Company 實例中的內容看反序列化是否正確 StringBuilder sb = new StringBuilder(); sb.Append("CompanyName = "+ company.CompanyName+Environment.NewLine); sb.Append("Website = " + company.Website + Environment.NewLine); sb.Append("Address = " + company.Address + Environment.NewLine); sb.Append("Boss = {" + company.Boss.UserId + ":" + company.Boss.UserName + ":" + company.Boss.Mobile + "}" + Environment.NewLine); sb.Append("PhoneNumber = [ "); foreach (string s in company.PhoneNumber) { sb.Append(s + " ; "); } sb.Append("]" + Environment.NewLine); sb.Append("Employees = [" + Environment.NewLine); foreach (User user in company.Employees) { sb.Append(" Employee = {" + user.UserId + ":" + user.UserName + ":" + user.Mobile + "}" + Environment.NewLine); } sb.Append("]" + Environment.NewLine); return sb.ToString(); }
打開 POSTMAN ,用 GET 方式訪問網址:http://localhost:61946/api/jsondemo/json7 得到如下結果:
可以看到 appcom.json 中屬性名和 Company.cs 、User.cs中屬性名相同(大小寫也一致)的已經反序列化成功了,
而 appcom.json 中的小寫的屬性沒有被反序列化, 要想忽略大小寫,
在調用 JsonSerializer.Deserialize( ) 時要傳入 Options 對象來指定反序列化時候的參數,
修改后的方法如下(見紅色代碼部分):
[Route("json7")] [HttpGet] public string Demo7() { //讀取 appcom.json 文件中的內容反序列化到 Company.cs中 string filePath = Path.GetFullPath("./appcom.json"); byte[] contents = System.IO.File.ReadAllBytes(filePath); ReadOnlySpan<byte> span = contents.AsSpan<byte>(); JsonSerializerOptions options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true //忽略大小寫 }; //調用 JsonSerializer 的 Deserialize( ) 即可實現反序列化 Company company = JsonSerializer.Deserialize<Company>(span, options); //輸出 Company 實例中的內容看反序列化是否正確 StringBuilder sb = new StringBuilder(); sb.Append("CompanyName = "+ company.CompanyName+Environment.NewLine); sb.Append("Website = " + company.Website + Environment.NewLine); sb.Append("Address = " + company.Address + Environment.NewLine); sb.Append("Boss = {" + company.Boss.UserId + ":" + company.Boss.UserName + ":" + company.Boss.Mobile + "}" + Environment.NewLine); sb.Append("PhoneNumber = [ "); foreach (string s in company.PhoneNumber) { sb.Append(s + " ; "); } sb.Append("]" + Environment.NewLine); sb.Append("Employees = [" + Environment.NewLine); foreach (User user in company.Employees) { sb.Append(" Employee = {" + user.UserId + ":" + user.UserName + ":" + user.Mobile + "}" + Environment.NewLine); } sb.Append("]" + Environment.NewLine); return sb.ToString(); }
編譯項目后再次訪問網址:http://localhost:61946/api/jsondemo/json6 得到如下結果:
可以看到所有屬性和值都已經設置成功了。