我正在使用jQuery的自动完成功能。当我试图检索超过17000条记录的列表(每个记录不会超过10个字符长度)时,它超过了长度并抛出错误:

异常信息: 异常类型:InvalidOperationException 异常消息:使用JSON JavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过maxJsonLength属性设置的值。

我可以在web.config中设置maxJsonLength的无限长度吗?如果不是,我可以设置的最大长度是多少?


当前回答

我在ASP中遇到了这个问题。NET Web表单。它完全忽略了网络。配置文件设置,所以我这样做:

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

当然,总的来说,这是一种糟糕的做法。如果您要在web服务调用中发送这么多数据,您应该考虑另一种方法。

其他回答

刚碰到这个。我有超过6000条记录。我就决定做点传呼。在我的MVC JsonResult端点中,我接受一个页码,它默认为0,所以它是不必要的,就像这样:

public JsonResult MyObjects(int pageNumber = 0)

然后不要说:

return Json(_repository.MyObjects.ToList(), JsonRequestBehavior.AllowGet);

我说:

return Json(_repository.MyObjects.OrderBy(obj => obj.ID).Skip(1000 * pageNumber).Take(1000).ToList(), JsonRequestBehavior.AllowGet);

这很简单。然后,在JavaScript中,不是这样的:

function myAJAXCallback(items) {
    // Do stuff here
}

相反,我说:

var pageNumber = 0;
function myAJAXCallback(items) {
    if(items.length == 1000)
        // Call same endpoint but add this to the end: '?pageNumber=' + ++pageNumber
    }
    // Do stuff here
}

然后把你的记录附加到你一开始用它们做的事情上。或者只是等待所有调用完成,然后将结果拼凑在一起。

我修好了。

//your Json data here
string json_object="........";
JavaScriptSerializer jsJson = new JavaScriptSerializer();
jsJson.MaxJsonLength = 2147483644;
MyClass obj = jsJson.Deserialize<MyClass>(json_object);

它工作得很好。

如果你从MVC中的MiniProfiler中得到这个错误,那么你可以通过设置属性MiniProfiler. settings . maxjsonresponsesize来增加这个值。默认情况下,该工具似乎忽略配置中设置的值。

MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

礼貌mvc-mini-profiler。

在MVC 4中,你可以做:

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult()
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior,
        MaxJsonLength = Int32.MaxValue
    };
}

在控制器中。

添加:

对于任何对你需要指定的参数感到困惑的人来说,调用可以是这样的:

Json(
    new {
        field1 = true,
        field2 = "value"
        },
    "application/json",
    Encoding.UTF8,
    JsonRequestBehavior.AllowGet
);

我们不需要任何服务器端更改。你只能通过web修改这个问题。配置文件 这对我很有帮助。试试这个

<appSettings>
 <add key="aspnet:MaxJsonDeserializerMembers" value="2147483647" />
<add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
</appSettings>  

and   

<system.web.extensions>
<scripting>
  <webServices>
    <jsonSerialization maxJsonLength="2147483647"/>
  </webServices>
</scripting>