c#---JSON的傳送與接收(轉)


本篇文章主要介紹如何在Ajax的客戶端與服務端之間傳送JSON格式的數據。那么我們先來說說什么是JSON吧。

JSON,即是JavaScript對象標記法,英文名稱是JavaScript Object Notation,簡稱JSON ,是 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999 的子集合,是從JavaScript的object initializer擴展而來的一種文本格式標記法,是作為數據交換之用的。

 

相對於XML,JSON在表示資料時更加簡潔,例如一個表示帳戶的資料,XML中可能表示:

[c-sharp]  view plain copy
  1. <account>  
  2.     <number>123456</number>  
  3.     <name>Justin</name>  
  4.     <balance>1000</balance>  
  5. </account>  
 

 

 

而使用JSON可以這樣表示:

 

[c-sharp]  view plain copy
  1. var account = {  
  2.     number : "123456",  
  3.     name: "Justin",  
  4.     balance: "1000"  
  5. };  

 

 

下面舉一個例子說明。

例如你可以把JSON表示法以POST發送至服務端,例如:

 

[c-sharp]  view plain copy
  1. var xmlHttp;  
  2.         function createXMLHttpRequest() {  
  3.             if (window.XMLHttpRequest) {  
  4.                 xmlHttp = new XMLHttpRequest();  
  5.             }  
  6.             else if (window.ActiveXObject) {  
  7.                 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");  
  8.             }  
  9.         }  
  10.         function prepareJSON() {  
  11.             var firstname = document.getElementById("FirstName").value;  
  12.             var lastname = document.getElementById("LastName").value;  
  13.             var person = new Object();  
  14.             person.FirstName = firstname;  
  15.             person.LastName = lastname;  
  16.             return person.toJSONString();  
  17.         }  
  18.         function handleAccount() {  
  19.             var json = prepareJSON();  
  20.             var url = "Handler1.ashx?timeStamp" + new Date().getTime();  
  21.             createXMLHttpRequest();  
  22.             xmlHttp.onreadystatechange = handleStateChange;  
  23.             xmlHttp.open("POST", url);  
  24.             xmlHttp.setRequestHeader("Content-Type",  
  25.                              "application/x-www-form-urlencoded");  
  26.             xmlHttp.send(json);  
  27.         }  
  28.         function handleStateChange() {  
  29.            
  30.             if (xmlHttp.readyState == 4) {  
  31.                 if (xmlHttp.status == 200) {  
  32.                     document.getElementById("response").innerHTML = xmlHttp.responseText;  
  33.                     var json = eval('(' + xmlHttp.responseText + ')');  
  34.                 }  
  35.             }  
  36.         }  

 

 

這個這個程序簡單地將用戶姓名包裝成一個對象,並使用toJSONString()將之轉換為JSON格式,之后POST至服務端。在服務端的程序如下所示:

 

Handler1中的中ProcessRequest代碼如下:


[c-sharp]  view plain copy
  1. public void ProcessRequest(HttpContext context)  
  2.        {  
  3.            HttpRequest request = context.Request;  
  4.            Stream stream = request.InputStream;  
  5.            string json = string.Empty;  
  6.            string responseJson = string.Empty;  
  7.            if (stream.Length != 0)  
  8.            {  
  9.                StreamReader streamReader = new StreamReader(stream);  
  10.                json = streamReader.ReadToEnd();  
  11.                Person person = JSONHelper.Deserialize<Person>(json);  
  12.                person.FirstName = "FN";  
  13.                person.LastName = "LN";  
  14.                responseJson = JSONHelper.Serialize<Person>(person);  
  15.            }  
  16.            if (!string.IsNullOrEmpty(responseJson))  
  17.            {  
  18.                context.Response.ContentType = "text/plain";  
  19.                context.Response.ContentType = "UTF-8";  
  20.                context.Response.Write(responseJson);  
  21.            }  
  22.        }  

 

 

另外,在服務端還需要對客戶端傳過來的JSON數據進行反序列化為一個Person對象實例,序列化與反序列化代碼如下:

 

[c-sharp]  view plain copy
  1. using System.Runtime.Serialization;  
  2. using System.Runtime.Serialization.Json;  
  3. using System.IO;  
  4. using System.Text;  
  5. public class JSONHelper  
  6. {  
  7.     public static string Serialize<T>(T obj)  
  8.     {  
  9.         DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());  
  10.         MemoryStream ms = new MemoryStream();  
  11.         serializer.WriteObject(ms, obj);  
  12.         string retVal = Encoding.Default.GetString(ms.ToArray());  
  13.         return retVal;  
  14.     }  
  15.     public static T Deserialize<T>(string json)  
  16.     {  
  17.         MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));  
  18.         DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));  
  19.         T obj = (T)serializer.ReadObject(ms);  
  20.         ms.Close();  
  21.         return obj;  
  22.     }  
  23. }  

 

 

此外,需要一個簡單的Person類的定義,

 

[c-sharp]  view plain copy
  1. using System.Runtime.Serialization;  
  2. namespace HelloAjaxJson  
  3. {  
  4.     [DataContract]  
  5.     public class Person  
  6.     {  
  7.         public Person() { }  
  8.         public Person(string firstname, string lastname)  
  9.         {  
  10.             this.FirstName = firstname;  
  11.             this.LastName = lastname;  
  12.         }  
  13.         [DataMember]  
  14.         public string FirstName { get; set; }  
  15.         [DataMember]  
  16.         public string LastName { get; set; }  
  17.     }  
  18. }  
轉至: http://blog.csdn.net/starandtina/article/details/4785552

 


免責聲明!

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



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