【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类型,我自己来负责解析?

转载于:https://www.cnblogs.com/kimmy/p/4283224.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值