最近老用这个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数据的,