【web Api性能提升技巧】(2)从DataReader手工创建Json字符串

这个思路是从 一篇文章,关于《提升web api的性能》上看到的。自己实践了一番,写下步骤。

传统的DataReader是遵循这样的一个步骤:

While(reader.Read())



{



//创建对象,赋值,添加到集合



}



//返回Json.序列化(集合)

 

现在我们采用的是手工拼接Json字符串:通过解析DataReader的数据格式、内容,采用StringBuilder.Append这种方式进行手工拼接。

避免了每次初始化对象、序列化集合所带来的内存、时间上的消耗。在查询数据量很大集合时,很有帮助。

代码很简单,就不多做解释了

using System;

using System.Data.SqlClient;

using System.Text;



namespace DataProvider.Common

{

    public class Tools

    {

        /// <summary>

        /// 将Reader集合转换成字符串

        /// </summary>

        /// <param name="reader"></param>

        /// <returns></returns>

        public static string ConvertReadersToJson(SqlDataReader reader)

        {

            var jsonStr = new StringBuilder();

            jsonStr.Append("[");



            while (reader.Read())

            {

                ConvertSingleReaderToJson(reader, jsonStr);

                jsonStr.Append(",");

            }



            if (jsonStr.Length > 3)

            {

                jsonStr.Length = jsonStr.Length - 1;

                jsonStr.Append("]");

                return jsonStr.ToString();

            }



            return string.Empty;

        }



        /// <summary>

        ///   将一个Reader转换成Json字符串,reader必须可读.read

        /// </summary>

        /// <param name="reader"></param>

        /// <param name="jsonStr"></param>

        public static void ConvertSingleReaderToJson(SqlDataReader reader, StringBuilder jsonStr)

        {

            jsonStr.Append("{");



            for (var i = 0; i < reader.FieldCount; i++)

            {

                //值类型数据不需要引号,否则需要

                var fieldType = reader.GetFieldType(i);

                object fileValue = reader[i];



                if (fieldType == typeof(DateTime))

                {

                    DateTime dt = DateTime.MinValue;



                    if (DateTime.TryParse(fileValue.ToString(), out  dt))

                    {

                        fileValue = ConvertDateTimeToJson(dt);

                    }

                }

                //日期作为特殊情况已经处理过了

                var comma = (fieldType == typeof(string) || fieldType == typeof(Guid)) ? "\"" : "";

                jsonStr.AppendFormat("\"{0}\":{2}{1}{2},", reader.GetName(i), fileValue, comma);

            }

            //去掉多余的逗号

            jsonStr.Length = jsonStr.Length - 1;

            jsonStr.Append("}"); 

        }





        /// <summary>

        /// 将.net 日期格式转换成Json日期格式

        /// </summary>

        /// <param name="dt"></param>

        /// <returns></returns>

        public static string ConvertDateTimeToJson(DateTime dt)

        {

            DateTime d1 = new DateTime(1970, 1, 1);

            DateTime d2 = dt.ToUniversalTime();

            TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);

            return string.Format("\"/Date({0})/\"", ts.TotalMilliseconds.ToString("#"));

        }

    }

}

 

PS:另外。请教下各位朋友,如何去除Web Api默认托管的Json.net序列化框架,改用自己手工写Json呢?

也就是说,Controller传入、传出的对象是String类型,我自己来负责解析?

你可能感兴趣的:(reader)