【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类型,我自己来负责解析?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端