WCF-json2

WCF2

原文:http://www.cnblogs.com/gylspx/archive/2012/04/20/wcf3.html

第三篇继续我的wcf之旅,数据库获取datatable数据,将它转换为json返回客户端,


1.经过昨天的初试牛刀,wcf就绪,今天搞点服务返回数据库获取datatable数据,将它转换为json返回客户端,
 
  当然你可以用ajax去调用,我是简单的用控制台输出了,ajax解析json格式字符串,应该不难,有时间的我会去晒一下,
 
  没时间的话,童鞋们,你们自己研究把,例子很多,jquery,js都可以简单的很.嘿嘿...
 
开篇把,先说一个我碰到的错误,顺便给你们说一下怎么调试出错误,系统会提示你怎么去修改
 


这是什么错误呢?看看怎么调试,首先设置webcfg
 


把这个节点设置一下:true
 
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
 
再去看刚才那错误,提示变长了,细读会发现提示错误是什么,怎么改
 


修改名字之后就可以了,好了,错误说到这把,下面还是按部就班的来:
 
2.首先是接口方法
 


还是老话,这句不能忘: //千万不能忘记这个标识,不然你会很蛋疼的,调不到服务
        [OperationContract]
 
3,实现接口,这里我把本来是一个类的公用方法抠出来了,经过改动之后完全可以,拿出来分享给童鞋们,大家一起学习成长
 
代码如下:
 


  /// <summary>
        /// 从数据库获取数据转换为json格式
        /// </summary>
        /// <returns></returns>
        public string GetDatas()
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Clear();
            string sql = "select USER_NAME from ADMIN_USERS ";
            DataTable dt = SqlHelper.ExecuteDataTable(SqlHelper.SHOP_CONN_STR, CommandType.Text, sql);
            string ms = DT2JSON(dt);
            return ms + "assa";
            //string sql = "select USER_NAME from ADMIN_USERS ";
            //DataSet dt = SqlHelper.ExecuteDataset(SqlHelper.SHOP_CONN_STR, CommandType.Text, sql);
            //return dt.GetXml();

            //string sql = "select USER_NAME from ADMIN_USERS ";
            //using (SqlConnection con=new SqlConnection(sql))
            //{  
            //     using(SqlCommand com=new SqlCommand(sql,con))
            //     {
            //         SqlDataAdapter da = new SqlDataAdapter(com);
            //         DataSet ds = new DataSet();
            //         da.Fill(ds);
            //         return ds;
            //     }
            //}
        }
        /// <summary>
        /// 一个将DataTable转化为JSon字符串序列的函数
        /// </summary>
        /// <param name="dt">输入的DataTable</param>
        /// <returns>返回的Json字符串,直接发送给Javascript</returns>
        public static string DT2JSON(DataTable dt)
        {
            /*
             * {"TableName":"table1","Columns":[{"ColumnName":"Name","DataType":"string"}],"Rows":[{"Name":"试试看\"我的\""}]}]
             */


            StringBuilder JsonString = new StringBuilder();

            if (dt != null)// && dt.Rows.Count > 0)
            {
                JsonString.Append("{[");
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    JsonString.Append('{');

                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":");
                        JsonString.Append(Obj2JSON(dt.Rows[i][j]));


                        if (j < dt.Columns.Count - 1)
                            JsonString.Append(',');
                    }

                    if (i < dt.Rows.Count - 1)
                        JsonString.Append("},");
                    else
                        JsonString.Append('}');
                }

                JsonString.Append("]}");
            }

            return JsonString.ToString();
        }
        /// <summary>
        /// 将对像转换为JSON模式的字符串
        /// </summary>
        /// <param name="jobj"></param>
        /// <returns></returns>
        public static string Obj2JSON(Object jobj)   //将某个对象转成json格式。
        {
            if (jobj == null) return "null";

            String s = jobj.GetType().ToString();

            if (s == "System.Int32")
                return ((Int32)jobj).ToString();

            if (s == "System.Int16")
                return ((Int16)jobj).ToString();

            if (s == "System.Int64")
                return ((Int64)jobj).ToString();

            if (s == "System.Double")
                return ((Double)jobj).ToString();

            if (s == "System.Decimal")
                return ((Decimal)jobj).ToString();

            if (s == "System.Byte")
                return ((Byte)jobj).ToString();

            if (s == "System.Guid")
                return "\"" + ((Guid)jobj).ToString() + "\"";

            if (s == "System.Boolean")
                return ((Boolean)jobj).ToString().ToLower();

            if (s == "System.DateTime")
                return DateTime2JSON((DateTime)jobj);

            if (s == "System.DBNull")
                return "null";

            if (s == "System.Data.DataTable")
                return DT2JSON((DataTable)jobj);

            if (s == "System.String")
                return String2JSON((String)jobj);

            return "\"????\"";

        }
        public static string String2JSON(string s)  //把一个字符串转换为JSON格式,转义"/\n等字符。如果是null就返回"null"
        {

            if (s == null)
                return "null";

            if (s.Length == 0)
            {
                return "\"\"";
            }

            char c;
            int i;
            int len = s.Length;
            StringBuilder sb = new StringBuilder(len + 4);
            string t = "";


            for (i = 0; i < len; i += 1)
            {
                c = s[i];
                if ((c == '\\') || (c == '"') || (c == '/'))
                {
                    sb.Append('\\');
                    sb.Append(c);
                }
                else if (c == '\b')
                    sb.Append("\\b");
                else if (c == '\t')
                    sb.Append("\\t");
                else if (c == '\n')
                    sb.Append("\\n");
                else if (c == '\f')
                    sb.Append("\\f");
                else if (c == '\r')
                    sb.Append("\\r");
                else
                {
                    if (c < ' ')
                    {
                        //t = "000" + Integer.toHexString(c);
                        string tmp = new string(c, 1);
                        try
                        {
                            t = "000" + int.Parse(tmp, System.Globalization.NumberStyles.HexNumber);
                        }
                        catch
                        {
                            //Letao.Common.Functions.ERP_ERROR(new Letao.Common.LTDB(), "错误的json字符:" + tmp,true);
                            sb.Append(c);
                            continue;
                        }

                        sb.Append("\\u" + t.Substring(t.Length - 4));
                    }
                    else
                    {
                        sb.Append(c);
                    }
                }
            }

            return "\"" + sb.ToString() + "\"";
        }

        /// <summary>
        /// 日期转换成JSON模式的字符串
        /// </summary>
        /// <param name="dte"></param>
        /// <returns></returns>
        public static string DateTime2JSON(DateTime dte)     //将DateTime 转成JSON格式。
        {
            String dtResult = "";

            //dtResult = "{\"DataType\":\"System.DateTime\",\"Value\":\"" +
            //    dte.ToUniversalTime().ToString("s") + "Z\"}";
            dtResult = "\"" + dte.ToString() + "\"";
            return dtResult;
        }


4.客户端调用,很多童鞋反映不知道怎么去调用,简单的一个方法,再开一个vs见一个项目,添加服务引用,地址写进去,前往就OK了
 


        using (SR.MyWcfClient client = new SR.MyWcfClient())
            {
           
                Console.WriteLine("========");
              
                 Console.WriteLine(client.GetDatas());
                Console.WriteLine("完成");
                Console.ReadKey();
            }
            Console.ReadKey();


5.运行结果:如图
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值