最近老用这个xml+js解析数据觉得用起来很不好,效率太低不说,代码的复杂度越来越高,就像一个胖子一样,不灵活,换个Json试一下,OK,挺好,多搞点数据,发现原来json还是真的应该尽早被我用来+js啊,呵呵,普通web应用果然应该采用Json来代替xml,不说了,给出教程吧
O(∩_∩)O~
现在我想做的这个实例,以一个文件构造json格式数据,通过jQuery ajax请求将其解析,然后填充Web页面内容。
1. 构造json格式数据并不是一件容易的事情,对于不是熟手的人来说,这里我需要用到一些Asp.net方面的知识来构造我的json数据,以响应请求,如果不熟悉Asp.net将可跳过该环节,我将在本节最后贴出生成的数据源,由于我想利用现有的代码,并充分运用实战技巧,所以该段代码有一点复杂,这里将综合个例,数据库中存在表:TabHOrder,记录用户的历史订单,如下图所示:
与一般性程序架构相同,程序中构造了一个与表相对应的实体类,实体类中的字段名就是表列名,实体类名称与表名相同,这里对该表的相关数据库访问代码及方法就省略了,特别提一下GetHOrderByTime这个方法,该方法用于查询在一定时间范围内相关用户的历史订单 ,
好了,简单的说明完了,建立一个HOrderResponse.ashx文件,给出ProcessRequest()代码如下:
context.Response.Clear();
context.Response.Buffer = true;
context.Response.ContentType = "application/json";
context.Response.ContentEncoding.GetBytes("utf-8");
//开始时间
String beginTime = Convert.ToString(context.Request.Form["beginTime"]);
beginTime = String.IsNullOrEmpty(beginTime) ? DateTime.Now.ToString("yyyy-MM-dd") : beginTime;
//结束时间
String endTime = Convert.ToString(context.Request.Form["endTime"]);
endTime = String.IsNullOrEmpty(endTime) ? DateTime.Now.AddDays(1).ToString("yyyy-MM-dd") : endTime; string mCode = Convert.ToString(context.Request.Form["mCode"]);
//获取查询结果
List<Model.Trade.TabHOrder> list =
new YXShop.BLL.Trade.TabHOrder().GetHOrderByTime(Convert.ToInt32(memberId), mCode, Convert.ToDateTime(beginTime), Convert.ToDateTime(endTime));
//获取json数据
String json = this.ConvertToJson(list); //确保垃圾回收
list = null;
//响应数据流
context.Response.Write(json);
context.Response.Flush();
context.Response.End();
ConvertToJson方法代码如下:
/// <summary>
/// 转换为Json格式数据
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
public String ConvertToJson(List<Model.Trade.TabHOrder> list)
{
String jsonStr = "{rows:[";
string mCode = null;//标志订单商品是否相同
int pre = 0;//标志商品的精度
for (int i = 0; i < list.Count(); i++)
{
Model.Trade.TabHOrder item = list[i];
double profit = (double)(item.HProfit / (double)100);
if (mCode != item.HOMCode)
{
mCode = item.HOMCode; //获取产品精度
pre = Convert.ToInt16(OtherBLL.SelectByWhere("MPrecision", "where MMcode='" + item.HOMCode.Trim() + "'", "TabMer", "").Rows[0][0].ToString());
}
jsonStr += "{cell:[/"" + item.HOid + "/",/""
+ item.HOMCode + "/",/"" + item.HOType + "/",/"" + item.HONum + "/",/""
+ item.HODTime + "/",/"" + item.HODPrice.ToString("f"+ pre) + "/",/"" + item.HOLossP.ToString("f"+pre) + "/",/""
+ item.HOProfitP.ToString("f"+pre) + "/",/"" + item.HODealType + "/",/"" + Convert.ToDouble((double)item.HOAccrual / (double)100).ToString("f2") + "/",/""
+ Convert.ToDouble((double)item.HODealCost / (double)100).ToString("f2") + "/",/"" + item.HOBgPrice.ToString("f"+pre) + "/",/""
+ item.HOBgTime + "/",/"" + item.HOBgType + "/",/""
+ profit.ToString("f2") + "/"]}";
if (i != list.Count() - 1)
{
jsonStr += ",";
}
}
jsonStr += "],goods:[";
//设置统计信息
List<String> codeList = list.Select(p => p.HOMCode).ToList();
List<String> disCodeList = codeList.Distinct().ToList();
for (int i = 0; i < disCodeList.Count(); i++)
{
//无重复商品名称
jsonStr += "{good:[/"" + disCodeList[i] + "/",/"";
//统计每种商品的买进总和
jsonStr += (from q in list where q.HOMCode == disCodeList[i] && q.HOType.Equals("Buy", StringComparison.CurrentCultureIgnoreCase) select (int)q.HONum).Sum() + "/",/"";
//统计每种商品的买出总和
jsonStr += (from q in list where q.HOMCode == disCodeList[i] && q.HOType.Equals("Sell", StringComparison.CurrentCultureIgnoreCase) select (int)q.HONum).Sum() + "/",/"";
//统计获利
double profit = (from q in list where q.HOMCode == disCodeList[i] select (int)q.HProfit).Sum() / (double)100;
jsonStr += profit.ToString("f2") + "元/"]}";
if (i != disCodeList.Count() - 1)
{
jsonStr += ",";
}
}
jsonStr += "]}";
//确保垃圾回收
codeList = null;
disCodeList = null;
return jsonStr;
}
那么我不会讲解我为什么要这么做,现在我讲解下我是如何构造这个json数据的,