第一部分:用戶端頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="WebApplication1.WebForm3" %>
<head runat="server">
<title></title>
<script src="jquery-1.3.2-vsdoc.js" type="text/javascript"></script>
<script src="json2.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
//構造一個json對象,很類似于C#中的匿名類型
var employee = {
Name: "chenxizhang",
Country: "China",
Orders: [
{ OrderID: 10248 },
{ OrderID: 10249 }
]
};
//發送POST請求,資料也是json格式。但數值部分需要轉換為字元串
$.post("EmployeeHandler.ashx", { data: JSON.stringify(employee) }, function(result) {
var r = JSON.parse(result);
alert(r.Message);
});
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
第二部分:ashx部分
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
using System.IO;
using System.Text;
//必須添加System.ServiceModel.Web和System.Runtime.Serialization的引用
namespace WebApplication1
{
/// <summary>
/// $codebehindclassname$ 的摘要說明
/// </summary>
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class EmployeeHandler : IHttpHandler
public void ProcessRequest(HttpContext context)
var ser = new DataContractJsonSerializer(typeof(Employee));
var data = context.Request["data"];
var ms = new MemoryStream(Encoding.UTF8.GetBytes(data));
var emp = (Employee)ser.ReadObject(ms);
ms.Close();
//此時已經得到了相應的Employee執行個體,可以進行伺服器端的處理
var ser2 = new DataContractJsonSerializer(typeof(ActionResult));
var ms2 = new MemoryStream();
var result = new ActionResult() { Code = 200, Message = "成功" };
ser2.WriteObject(ms2, result);
ms2.Position = 0;
var buffer = new byte[ms2.Length];
ms2.Read(buffer, 0, buffer.Length);
ms2.Close();
context.Response.Write(Encoding.UTF8.GetString(buffer));
//傳回結果
}
public bool IsReusable
get
return false;
[DataContract]
public class Employee {
[DataMember]
public string Name { get; set; }
public string Country { get; set; }
public OrderItem[] Orders { get; set; }
public class OrderItem
public int OrderID { get; set; }
public class ActionResult
public int Code { get; set; }
public string Message { get; set; }
第三部分:進一步的優化,編寫兩個擴充方法(這是C# 3.0的新特性) /// <summary>
/// 這個類型實作了對JSON資料處理的一些擴充方法
public static class JsonExtensions
/// 根據一個字元串,進行JSON的反序列化,轉換為一個特定類型
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
/// <returns></returns>
public static T ToJsonObject<T>(this string data) {
var serializer = new DataContractJsonSerializer(typeof(T));
var ms = new MemoryStream(
Encoding.UTF8.GetBytes(data));
var result = (T)serializer.ReadObject(ms);
return result;
/// 将任何一個對象轉換為JSON字元串
/// <param name="obj"></param>
public static string ToJsonString<T>(this T obj) {
var ms = new MemoryStream();
serializer.WriteObject(ms, obj);
ms.Position = 0;
var result = Encoding.UTF8.GetString(ms.GetBuffer());
} 這樣,在ashx裡面的代碼就很簡單了 var emp = context.Request["data"].ToJsonObject<Employee>();
context.Response.Write(result.ToJsonString());
不錯吧,這樣以後處理Json就是如此容易
通過Json來傳遞資料,可以避免以前用傳統的post或者get方面拼接字元串中的麻煩
本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1081648