zoukankan      html  css  js  c++  java
  • 【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类型,我自己来负责解析?

  • 相关阅读:
    usaco-4.1-nuggets-passed
    usaco-3.4-rockers-passed
    usaco-3.4-fence9-passed
    usaco-3.4-heritage-passed
    usaco-3.3-game1-passed
    usaco-3.3-range-passed
    usaco-3.3-camelot-passed
    6.23课堂作业
    初识JVM虚拟机
    JDK安装以及配置环境变量的步骤
  • 原文地址:https://www.cnblogs.com/kimmy/p/4283224.html
Copyright © 2011-2022 走看看