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

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

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


当前回答

注意:这个答案只适用于Web服务,如果你从Controller方法返回JSON,请确保你也阅读了下面的SO答案:https://stackoverflow.com/a/7207539/1246870


MaxJsonLength属性不能无限制,是一个默认为102400 (100k)的整数属性。

你可以在你的web.config中设置MaxJsonLength属性:

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

其他回答

刚碰到这个。我有超过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
}

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

对于那些有问题的MVC3 JSON自动反序列化的模型绑定和太大,这里有一个解决方案。

将JsonValueProviderFactory类的代码从MVC3源代码复制到一个新类中。 添加一行来更改对象反序列化之前的最大JSON长度。 用修改后的新类替换JsonValueProviderFactory类。

感谢http://blog.naver.com/techshare/100145191355和https://gist.github.com/DalSoft/1588818为我指明了正确的方向,如何做到这一点。第一个站点上的最后一个链接包含解决方案的完整源代码。

注意:这个答案只适用于Web服务,如果你从Controller方法返回JSON,请确保你也阅读了下面的SO答案:https://stackoverflow.com/a/7207539/1246870


MaxJsonLength属性不能无限制,是一个默认为102400 (100k)的整数属性。

你可以在你的web.config中设置MaxJsonLength属性:

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

使用lib \ Newtonsoft.Json.dll

public string serializeObj(dynamic json) {        
    return JsonConvert.SerializeObject(json);
}

如果,在实现上述添加到您的网页。config,你会得到一个“无法识别的配置部分system.web.extensions”。的错误,然后尝试将此添加到您的网页。<ConfigSections> section中的config:

            <sectionGroup name="system.web.extensions" type="System.Web.Extensions">
              <sectionGroup name="scripting" type="System.Web.Extensions">
                    <sectionGroup name="webServices" type="System.Web.Extensions">
                          <section name="jsonSerialization" type="System.Web.Extensions"/>
                    </sectionGroup>
              </sectionGroup>
        </sectionGroup>