JavaScriptSerializer Serialize()方法无法返回非常大的json字符串

问题描述:

我有一个web服务函数,我从中获得将近100 000条记录。JavaScriptSerializer Serialize()方法无法返回非常大的json字符串

DataSet ds = new DataSet(); 
     ds = OdbcHelper.ExecuteDataset(Connection.ODBCConnection(), CommandType.StoredProcedure, "{ CALL Search_SP(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}", p); 
     foreach (DataRow dr in ds.Tables[0].Rows) 
     { 
      row = new Dictionary<string, object>(); 
      foreach (DataColumn col in ds.Tables[0].Columns) 
      { 
       row.Add(col.ColumnName.Trim(), dr[col]); 
      } 
      rows.Add(row); 

     } 
     return serializer.Serialize(rows); 

这是我的javascript: -

​​

当我调试,我发现我的存储过程也能正常工作的代码。执行和获取超过50 000条记录需要不到5秒的时间。但是“return serializer.Serialize(rows);”花了很多时间返回json字符串。 如果行数为100,则需要30-35秒,对于100k记录,它几乎会死亡。不会返回任何输出。类似应用程序的问题会被吊死。

我无法理解为什么需要这么多时间。我的数据库中的记录数量每天会增加50 000多。

+0

如果您知道预期的结果,请尝试手动序列化,例如'for .. json + ='{foo:“bar”}“',它可能会更快,因为您会假设类型而不是测试每种类型 –

+2

没有办法查询和向用户显示100,000行数据将导致可用的应用程序。特别是如果数据每天增长50,000行。考虑分页或按需部分加载。 –

+0

它不是我需要获取数据库中的所有记录,但我将不得不显示至少100000条记录minimum.I已经在grid.But使用分页。但序列化方法本身需要很多时间来返回数据 – Pwavel002

我想你应该改变序列化netwonsoft Json.Net

你也可以创造比数据行精简类,并序列化一个代替另一个建议是分裂的小批量此调用(如分页)

代码示例:

List<MyClass> list = new List<MyClass>(); 
foreach (DataRow dr in ds.Tables[0].Rows) 
{ 
    var myObj = new MyClass(); 
    myObj.MyColumn = dr["MyColumn"]; 
    .. // and so on all your columns as properties on MyClass 
} 
return JsonConvert.SerializeObject(list); 
+0

我怎么能分割这个调用小批量?有什么想法?我没有任何关于精简课的想法。 – Pwavel002

+0

将示例更改为poco(普通旧clr对象),这是比datarow更精简的对象。 ,拆分你必须得到N行,然后得到下N个行数有点复杂,但我认为这是发送10万行的唯一方法 – Thorarins

尝试使用另一个串行像Newtosoft.JsonServiceStack.Text