Json的序列化和反序列化


一.什么是Json:

  中午肚子餓了,到餐廳點餐。向服務員點了幾個菜,廚師根據用戶的需求,開始烹飪食物,食物烹飪好后,怎么將食物呈現給用戶呢?這時就需要用到盛放食物的碗了。用戶拿到盛放食物的碗,就可以獲得點的餐了。這個碗就充當了數據交換的容器了(^-^)

 

  客戶端向服務器端發送請求后,服務器端怎么才能把用戶需要的數據返回給客戶端呢。這時我們就需要用一個指定的格式將數據,按照指定格式返回客戶端。這時就有了兩種數據傳輸的方式(XMLJson):

  在普通的Web應用中,不管是服務器端還是客戶端解析XML代碼會非常麻煩,所以這時Json就更加滿足數據傳輸解析的要求。采用Json格式的方式進行數據的傳輸,不僅方便傳輸解析,還特別易於人閱讀和編寫

二.XML與Json轉換:

1.常規轉換:

<emp>
    <name>fxhl</name>
    <city>深圳</city>
    <age>23</age>
</emp>

轉換為Json為:

  {“name”:“fxhl”,"city":"深圳","age":23}

三.Json的表現形式:

  1.對象:

{
    "returnCode": "R0000",
    "returnMsg": "成功",
    "lessTimes": "2",
    "domainLink": "",
    "seqNum": "1",
    "identification": "595279",
    "isNeedImageCode": "false"
}

  2.數組:

{
    "employees": [
        { "firstName":"John" , "lastName":"Doe" },
        { "firstName":"Anna" , "lastName":"Smith" },
        { "firstName":"Peter" , "lastName":"Jones" }
    ]
}

  3.數組對象混合:

    這是截取的一小部分,對於比較復雜的Json格式的字符串,可以在線驗證json。格式化一個格式。方便觀看

      • Json的表現形式一般就三種(對象,數組,字符串),使用過程中,只是將對象與數組進行混合了
{
    "icon": [
        {
            "title": "尚天貓,就購了",
            "icon_category": "baobei",
            "icon_key": "icon-service-tianmao",
            "trace": "srpservice",
            "innerText": "天貓寶貝",
            "url": "//www.tmall.com/"
        },
        { "title": "保險理賠",
            "position": "99",
            "innerText": "分組-保險理賠",
            "iconPopupComplex": 
       {
"popup_title": "保險理賠", "subIcons": [ { "dom_class": "icon-service-yunfeixian", "icon_content": "賣家贈送退貨運費險" } ] } } ] }

四.Json序列化和反序列化的三種方式

1.使用JavaScriptSerializer類:

//使用JavaScriptSerializer方式需要引入的命名空間,這個在程序集System.Web.Extensions.dll.中

using System.Web.Script.Serialization;

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         //序列化操作
 6         JavaScriptSerializer jss = new JavaScriptSerializer();
 7         var json = new { name = "fxhl", age = 23 };           
 8         string str = jss.Serialize(json);  
 9         //反序列化操作
10         Person person = jss.Deserialize<Person>(str);
11         Console.WriteLine(person.name);
12     }
13 }  
14 [Serializable]      
15 public class Person
16 {
17     public string name { get; set; }
18     public int age { get; set; }
19 }

2.使用DataContractJsonSerializer類:

 //Person實體中的契約 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必須要加的

//使用DataContractJsonSerializer方式需要引入的命名空間,在System.Runtime.Serialization.dll.中

 using System.Runtime.Serialization.Json;

 1     static void Main(string[] args)
 2     {
 3         //序列化操作
 4         Person p1 = new Person()
 5         {
 6             name = "fxhl",
 7             age = 23
 8         };
 9         DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Person));
10         MemoryStream msObj = new MemoryStream();
11         //將序列化之后的Json格式數據寫入流中
12         js.WriteObject(msObj, p1);
13         //從0這個位置開始讀取流中的數據
14         msObj.Position = 0;     
15         StreamReader sr = new StreamReader(msObj, Encoding.UTF8);
16         string json = sr.ReadToEnd();
17         Console.WriteLine(json);
18         sr.Close();
19         msObj.Close();
20         //反序列化操作
21         using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
22         {
23             DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Person));
24             Person model = (Person)deseralizer.ReadObject(ms);// //反序列化ReadObject
25             Console.WriteLine(model.name);
26         }
27         Console.ReadKey();
28     }
29 }
30 [DataContract]     
31 public class Person
32 {
33     [DataMember]
34     public string name { get; set; }
35     [DataMember]
36     public int age { get; set; }
37 }

3.使用JSON.NET類庫:

引入類庫:

//使用Json.NET類庫需要引入的命名空間

 1 class Program
 2 {
 3 static void Main(string[] args)
 4 {
 5     //序列化操作
 6     var json = new { user = new { name = "fxhl", age = 23 }};
 7     string jsonData = JsonConvert.SerializeObject(json);
 8     Console.WriteLine(jsonData);
 9     //反序列化操作方法一
10     Person p1= JsonConvert.DeserializeObject<Person>(jsonData);
11     Console.WriteLine(p1.user.name);
12     //反序列化操作方法二
13     string json2 = "[{\"user\":{\"name\":\"fxhl\",\"age\":23}}]";
14     List<Person> listp2= JsonConvert.DeserializeObject<List<Person>>(json2);
15     Console.WriteLine(listp2[0].user.name);
16     Console.ReadKey();
17 }
18 }
19 public class Person
20 {
21     public Person user { get; set; }
22     public string name { get; set; }
23     public int age { get; set; }
24 }

 

 總結:最后還是盡量使用JSON.NET來序列化和反序列化,性能好。


免責聲明!

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



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