本篇文章主要介绍如何在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 plaincopy
  1. <account>  
  2.     <number>123456</number>  
  3.     <name>Justin</name>  
  4.     <balance>1000</balance>  
  5. </account>  
 

 

 

而使用JSON可以这样表示:

 

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

 

 

下面举一个例子说明。

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

 

[c-sharp] view plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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

 

 posted on 2012-11-13 14:01  vingi_苍月  阅读(48770)  评论(0编辑  收藏  举报