问题:使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值
分析:
意味着你尝试处理的 JSON
字符串超过了 JavaScriptSerializer
默认的最大长度限制。默认限制,JavaScriptSerializer
类的 MaxJsonLength
属性默认设置为 2097152 字节(即 2MB)
。这意味着如果你尝试序列化或反序列化超过这个大小的 JSON
数据,就会抛出异常。
解决方案
1、增加 MaxJsonLength 的值:
csharp
using System.Web.Script.Serialization;
var jsonResult="";//你要返回的参数
var seriializer = new JavaScriptSerializer();
seriializer.MaxJsonLength = Int32.MaxValue;// 或者设置为一个合理的更高值
var result = new ContentResult
{
Content = seriializer.Serialize(jsonResult),
ContentType = "application/json"
};
return result;
2、使用Newtonsoft.Json序列化库
csharp
using Newtonsoft.Json;
var jsonString = JsonConvert.SerializeObject(yourObject);
// 或者
var Obj = JsonConvert.DeserializeObject<T>(jsonString);
或者自定义
csharp
JsonSerializerSettings settings = new JsonSerializerSettings
{
MaxDepth = 100, // 可以根据需要设置
MaxJsonLength = int.MaxValue // 或者设置为一个合理的更高值
};
string jsonString = JsonConvert.SerializeObject(yourObject, settings);
3、对返回的参数进行分页返回
csharp
int rows = Convert.ToInt32(Request["rows"] ?? "20");//条数
int page = Convert.ToInt32(Request["page"] ?? "1");//页码
int numF = (page - 1) * rows ;
int numT = page * rows;
var data = new PreContainerGoodsBll().GetShipmentEntrustmentList(SED_STARTDATE, SED_ENDDATE, SED_CST_ID, SED_STATUS, SED_NUM, SED_PDI_NAME, SED_EPT_ID, SED_TYPE1, SED_TYPE2, SED_TYPE, PER_TRK_TRKNO);//要返回的参数
var pagedData = data
.Skip(numF) // 跳过前面的(pageNumber - 1) * pageSize个元素
.Take(numT) // 取接下来的pageSize个元素
.ToList(); // 将结果转换为列表
var jsonResult = new { total = data.Count<SHIPMENT_ENTRUSTMENTModel>(), rows = pagedData };
return Json(jsonResult, JsonRequestBehavior.AllowGet);