本篇文章主要介紹如何在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中可能表示:
- <account>
- <number>123456</number>
- <name>Justin</name>
- <balance>1000</balance>
- </account>
而使用JSON可以這樣表示:
- var account = {
- number : "123456",
- name: "Justin",
- balance: "1000"
- };
下面舉一個例子說明。
例如你可以把JSON表示法以POST發送至服務端,例如:
- var xmlHttp;
- function createXMLHttpRequest() {
- if (window.XMLHttpRequest) {
- xmlHttp = new XMLHttpRequest();
- }
- else if (window.ActiveXObject) {
- xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
- }
- function prepareJSON() {
- var firstname = document.getElementById("FirstName").value;
- var lastname = document.getElementById("LastName").value;
- var person = new Object();
- person.FirstName = firstname;
- person.LastName = lastname;
- return person.toJSONString();
- }
- function handleAccount() {
- var json = prepareJSON();
- var url = "Handler1.ashx?timeStamp" + new Date().getTime();
- createXMLHttpRequest();
- xmlHttp.onreadystatechange = handleStateChange;
- xmlHttp.open("POST", url);
- xmlHttp.setRequestHeader("Content-Type",
- "application/x-www-form-urlencoded");
- xmlHttp.send(json);
- }
- function handleStateChange() {
- if (xmlHttp.readyState == 4) {
- if (xmlHttp.status == 200) {
- document.getElementById("response").innerHTML = xmlHttp.responseText;
- var json = eval('(' + xmlHttp.responseText + ')');
- }
- }
- }
這個這個程序簡單地將用戶姓名包裝成一個對象,並使用toJSONString()將之轉換為JSON格式,之后POST至服務端。在服務端的程序如下所示:
Handler1中的中ProcessRequest代碼如下:
- public void ProcessRequest(HttpContext context)
- {
- HttpRequest request = context.Request;
- Stream stream = request.InputStream;
- string json = string.Empty;
- string responseJson = string.Empty;
- if (stream.Length != 0)
- {
- StreamReader streamReader = new StreamReader(stream);
- json = streamReader.ReadToEnd();
- Person person = JSONHelper.Deserialize<Person>(json);
- person.FirstName = "FN";
- person.LastName = "LN";
- responseJson = JSONHelper.Serialize<Person>(person);
- }
- if (!string.IsNullOrEmpty(responseJson))
- {
- context.Response.ContentType = "text/plain";
- context.Response.ContentType = "UTF-8";
- context.Response.Write(responseJson);
- }
- }
另外,在服務端還需要對客戶端傳過來的JSON數據進行反序列化為一個Person對象實例,序列化與反序列化代碼如下:
- using System.Runtime.Serialization;
- using System.Runtime.Serialization.Json;
- using System.IO;
- using System.Text;
- public class JSONHelper
- {
- public static string Serialize<T>(T obj)
- {
- DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
- MemoryStream ms = new MemoryStream();
- serializer.WriteObject(ms, obj);
- string retVal = Encoding.Default.GetString(ms.ToArray());
- return retVal;
- }
- public static T Deserialize<T>(string json)
- {
- MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
- DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
- T obj = (T)serializer.ReadObject(ms);
- ms.Close();
- return obj;
- }
- }
此外,需要一個簡單的Person類的定義,
- using System.Runtime.Serialization;
- namespace HelloAjaxJson
- {
- [DataContract]
- public class Person
- {
- public Person() { }
- public Person(string firstname, string lastname)
- {
- this.FirstName = firstname;
- this.LastName = lastname;
- }
- [DataMember]
- public string FirstName { get; set; }
- [DataMember]
- public string LastName { get; set; }
- }
- }
轉至: http://blog.csdn.net/starandtina/article/details/4785552
