.net5 core webapi進階之二:System.Text.Json的用法詳解(下篇)JSON序列化和反序列化


本篇接着介紹 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 得到如下結果:

可以看到所有屬性和值都已經設置成功了。

 


免責聲明!

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



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