.net json对象序列化与反列化超长问题

.net json对象序列化与反列化超长问题

717发表于2019-04-03

.net中json超长问题分为两种情况, 一种是在前台提交的信息的时候,如果ajax提交的json长度超过了默认值在反序列化会报错。另一种是服务端返加数据的时候,也就是把对象转换成json的时候。

一、反序列化

异常捕捉:JSON 请求太大,无法反序列化。, Exception=>   在 System.Web.mvc.JsonValueProviderFactory.EntryLimitedDictionary.Add(String key, Object value)
   在 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value)
   在 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value)
   在 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value)
   在 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value)
   在 System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext)
   在 System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext)
   在 System.Web.Mvc.ControllerBase.get_ValueProvider()
   在 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor)
   在 System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
   在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass1e.<BeginInvokeAction>b__16(AsyncCallback asyncCallback, Object asyncState),   在 System.Web.Mvc.JsonValueProviderFactory.EntryLimitedDictionary.Add(String key, Object value)
   在 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value)
   在 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value)
   在 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value)
   在 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value)
   在 System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext)
   在 System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext)
   在 System.Web.Mvc.ControllerBase.get_ValueProvider()
   在 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor)
   在 System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
   在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass1e.<BeginInvokeAction>b__16(AsyncCallback asyncCallback, Object asyncState)
---------------------------------------------------------

解决办法:

在Web.config中节点appSettings下加入以下配置

<add key="aspnet:MaxJsonDeserializerMembers" value="150000" />

表示反序列化最大项目个数为:150000

注意:度量单位是可以反序列化的项目数(键/值对),如果您的JSON有500个成员(键/值对)并且您的限制为400,那么它将失败。而不是字节大小 。

二、序列化

2.1、MVC中

在mvc 返回json的时候指定json最大长度大小,默认2097152个字符,相当于4MB,Unicode字符串。

return new JsonResult { Data = r, MaxJsonLength = Int32.MaxValue };

r为你的业务对象

2.2、Web Service中

<configuration>  
   <system.web.extensions>
       <scripting>
           <webServices>
               <!-- Update this value to change the value to 
                    a larger value that can accommodate your JSON 
                    strings -->
               <jsonSerialization maxJsonLength="86753090" />
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration>  

2.3、使用JavaScriptSerializer

// Creates an instance of your JavaScriptSerializer 
// and Setting the MaxJsonLength
var serializer = new JavaScriptSerializer() { MaxJsonLength = 86753090 };

// Perform your serialization
serializer.Serialize("Your JSON Contents");  

小编蓝狐