Ошибка при десериализации с использованием JSON JavaScriptSerializer. [Дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

578
задан Jim G. 15 January 2015 в 16:02
поделиться

27 ответов

Если вы используете MVC 4, обязательно проверьте этот ответ .


Если вы все еще получаете error:

  • после установки свойства maxJsonLength в максимальное значение в web.config
  • , и вы знаете, что длина ваших данных меньше этого значения
  • , и вы не используете метод веб-службы для сериализации JavaScript

, ваша проблема в том, что:

Значение свойства MaxJsonLength применяется только к внутреннему экземпляру JavaScriptSerializer, который используется асинхронным уровнем связи для вызова методов Web-сервисов. ( MSDN: ScriptingJsonSerializationSection.MaxJsonLength Свойство )

В принципе, «внутренний» JavaScriptSerializer учитывает значение maxJsonLength, когда вызывается из веб-метода; прямое использование JavaScriptSerializer (или использование с помощью MVC action-method / Controller) не учитывает свойство maxJsonLength, по крайней мере, не из раздела systemWebExtensions.scripting.webServices.jsonSerialization файла web.config.

As обходной путь, вы можете сделать следующее в своем контроллере (или в любом месте):

var serializer = new JavaScriptSerializer();

// For simplicity just use Int32's max value.
// You could always read the value from the config section mentioned above.
serializer.MaxJsonLength = Int32.MaxValue;

var resultData = new { Value = "foo", Text = "var" };
var result = new ContentResult{
    Content = serializer.Serialize(resultData),
    ContentType = "application/json"
};
return result;

Этот ответ - моя интерпретация этого ответа на форум asp.net .

632
ответ дан Community 20 August 2018 в 10:42
поделиться
  • 1
    Это целое число, поэтому максимальное значение, которое вы можете установить, равно: 2147483644 – David Espart 9 September 2010 в 11:43
  • 2
    @despart: Вы имеете в виду 2 147 483 647. – Dercsár 28 July 2011 в 12:27
  • 3
    @ kmcc049, IMO значения не являются ошибочными, потому что если вы посмотрите на вопрос, OP не спрашивает & quot; каково значение по умолчанию maxJsonLength? & quot; (BTW, второй самый проголосовавший ответ отвечает на этот, неправильный вопрос), он пытается установить это свойство как «неограниченное», но поскольку это целое число, возможно максимальное значение максимум : 2147483647 as @depsart и @ Descár указывают. – CMS 23 September 2011 в 15:49
  • 4
    Ваш ответ был действительно полезен, поскольку я использую метод результата действия Json() в asp.net mvc. – jessegavin 9 January 2012 в 17:58
  • 5
    Да, я тоже был Json (). Благодаря! – BritishDeveloper 13 March 2012 в 10:54
  • 6
    Отлично, но обратите внимание на ответ @David Murdoch ниже, если у вас возникла эта проблема при использовании MVC return Json() или чего-то еще – BritishDeveloper 13 March 2012 в 10:55
  • 7
    Хотя это совершенно правильно и заслуживает своего места, это один из тех вопросов, где стоит прочитать прошлый ответ :). Благодаря! – Nigel 19 April 2012 в 09:14
  • 8
    Отличное решение! Web.config не работал для меня, используя asp.net mvc 2 – 321X 20 April 2012 в 16:38
  • 9
    @ Dercsár: В чем смысл? 2147483644 - самое большое целое число, отличное от 1024. – naveen 27 June 2012 в 11:34
  • 10
    Если вы используете MVC4, см. Также ответ @fanisch. – Beyers 11 January 2013 в 12:44
645
ответ дан Community 31 October 2018 в 08:45
поделиться

Я предлагаю установить его в Int32.MaxValue.

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;
5
ответ дан Aelexe 20 August 2018 в 10:42
поделиться

Просто установите свойство MaxJsonLength в методе действия MVC

JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet);
json.MaxJsonLength = int.MaxValue;
return json;
6
ответ дан Aftab Ahmed Kalhoro 20 August 2018 в 10:42
поделиться

Как насчет некоторой магии атрибутов?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class MaxJsonSizeAttribute : ActionFilterAttribute
{
    // Default: 10 MB worth of one byte chars
    private int maxLength = 10 * 1024 * 1024;

    public int MaxLength
    {
        set
        {
            if (value < 0) throw new ArgumentOutOfRangeException("value", "Value must be at least 0.");

            maxLength = value;
        }
        get { return maxLength; }
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        JsonResult json = filterContext.Result as JsonResult;
        if (json != null)
        {
            if (maxLength == 0)
            {
                json.MaxJsonLength = int.MaxValue;
            }
            else
            {
                json.MaxJsonLength = maxLength;
            }
        }
    }
}

Затем вы можете применить ее глобально, используя глобальную конфигурацию фильтра или контроллер / действие.

5
ответ дан Balázs 20 August 2018 в 10:42
поделиться

использовать lib\Newtonsoft.Json.dll

public string serializeObj(dynamic json) {        
    return JsonConvert.SerializeObject(json);
}
0
ответ дан Bartłomiej Semańczyk 20 August 2018 в 10:42
поделиться

, если после реализации вышеуказанного добавления в ваш web.config вы получите сообщение «Unrecognized configuration section system.web.extensions.», затем попробуйте добавить это в свой web.config в секции <ConfigSections>:

            <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>
15
ответ дан bkdraper 20 August 2018 в 10:42
поделиться
  • 1
    У меня была эта проблема. Однако этот ответ не помог мне. Вместо добавления & lt; sectionGroup & gt; описанный здесь, я просто переместил все недавно добавленные & lt; system.web.extensions & gt; блок до самого конца моего web.config ... прямо перед & lt; / configuration & gt ;. Тогда это сработало. – ClearCloud8 2 November 2012 в 17:09
  • 2
    Это помогло, но в моей ситуации мне нужно было изменить четвертую строку на <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>, как показано на этой странице: forums.asp.net/t/1446510.aspx/1 – Nathan 25 June 2013 в 14:54
  • 3
    @ ClearCloud8 Немедленно получите этот комментарий на этой странице. – Jack Nutkins 25 January 2016 в 01:04

Вы можете установить его в конфиге, как говорили другие, или вы можете установить на отдельный экземпляр сериализатора, например:

var js = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue };
2
ответ дан Caleb Postlethwait 20 August 2018 в 10:42
поделиться

Вопрос в том, действительно ли вам нужно вернуть 17 тыс. записей? Как вы планируете обрабатывать все данные в браузере? В любом случае пользователи не будут прокручивать 17000 строк.

Лучшим подходом является получение только «самых лучших» записей и загрузка по мере необходимости.

4
ответ дан Chetan Sastry 20 August 2018 в 10:42
поделиться
  • 1
    Список по умолчанию из json даст 17 тыс. Записей. Но функция автозаполнения будет перечислять только записи, соответствующие символам, которые пользователь вводит, поэтому вам больше не потребуется прокручивать список. Так что мне нужно установить неограниченную длину для maxJsonLength, которая может сериализовать данные 17k. – Prasad 20 July 2009 в 07:53
  • 2
    Вы можете использовать комбинацию фильтрации на сервере и на стороне клиента. Было бы сложно отфильтровать все данные на стороне клиента, не говоря уже о латентности сети. – Chetan Sastry 20 July 2009 в 08:17
  • 3
    Придя к этому же вопросу некоторое время назад, я решил реализовать «onsearch», обработчик для автозаполнения, и вызов веб-службы проходит «поиск», текст и выполните запрос Top10, используя критерии поиска в качестве фильтра. Это означало более индивидуальные запросы ajax, которые просто получали полный список на загрузку страницы, но это также означало, что все запросы / ответы были much меньше. – Mike U 11 December 2015 в 22:21

Решение для WebForms UpdatePanel:

Добавить параметр в Web.config:

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

https://support.microsoft.com/en-us/ kb / 981884

ScriptRegistrationManager содержит следующий код:

// Serialize the attributes to JSON and write them out
JavaScriptSerializer serializer = new JavaScriptSerializer();

// Dev10# 877767 - Allow configurable UpdatePanel script block length
// The default is JavaScriptSerializer.DefaultMaxJsonLength
if (AppSettings.UpdatePanelMaxScriptLength > 0) {
    serializer.MaxJsonLength = AppSettings.UpdatePanelMaxScriptLength;
}  

string attrText = serializer.Serialize(attrs);
0
ответ дан Der_Meister 20 August 2018 в 10:42
поделиться

Вам не нужно делать с web.config. Вы можете использовать короткое свойство во время значения catch в списке прохода. Например, объявить модель, например

public class BookModel
    {
        public decimal id { get; set; }  // 1 

        public string BN { get; set; } // 2 Book Name

        public string BC { get; set; } // 3 Bar Code Number

        public string BE { get; set; } // 4 Edition Name

        public string BAL { get; set; } // 5 Academic Level

        public string BCAT { get; set; } // 6 Category
}

, здесь я использую короткие пропорции, такие как BC = штрих-код BE = книжное издание и т. Д.

-1
ответ дан Diponkor 20 August 2018 в 10:42
поделиться
  • 1
    Это не поможет, если основная часть данных находится в значениях свойств – Window 31 May 2018 в 21:44

Похоже, что нет «неограниченного» значения. По умолчанию используется 2097152 символов, что эквивалентно 4 МБ строковых данных Юникода.

Как уже отмечалось, 17 000 записей трудно использовать в браузере. Если вы представляете сводный вид, может быть намного эффективнее выполнять агрегацию на сервере и передавать только сводку в браузере. Например, рассмотрите файловую систему brower, мы видим только верхнюю часть дерева, а затем отправляем дальнейшие запросы по мере развертывания. Количество записей, возвращаемых в каждом запросе, сравнительно невелико. Представление древовидного представления может хорошо работать для больших наборов результатов.

2
ответ дан djna 20 August 2018 в 10:42
поделиться
  • 1
    довольно странно по умолчанию в коде (новый JavaScriptSerializer ()). MaxJsonLength - 2097152 байт, но веб-служба ResponseFormatJson - это 102400 байт, если явно не задано. – rob 24 July 2014 в 10:56

Если вы сталкиваетесь с такой проблемой в представлении, вы можете использовать метод ниже, чтобы решить эту проблему. Здесь Iused пакет Newtonsoft.

@using Newtonsoft.Json
<script type="text/javascript">
    var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part));
</script>
2
ответ дан dush88c 20 August 2018 в 10:42
поделиться
  • 1
    Означает ли это, что мне не нужно беспокоиться о максимальной длине, если я использую Json.NET? Я не думаю, что есть способ установить максимальную длину в Json.NET, поэтому я надеюсь, что это просто работает из коробки. – kimbaudi 15 November 2017 в 21:52

У меня возникла эта проблема в веб-формах ASP.NET. Это полностью игнорировало настройки файла web.config, поэтому я сделал это:

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

Конечно, в целом это ужасная практика. Если вы отправляете много данных в вызове веб-службы, вы должны посмотреть на другой подход.

30
ответ дан Flea 20 August 2018 в 10:42
поделиться
  • 1
    это работало для вас? где вы разместили этот код? – user1012598 10 February 2015 в 07:12
  • 2
    Наша проблема состояла в том, что у нас была текстовая область, которая позволяла HTML, а люди вставляли изображения в HTML, что привело к тому, что запись стала очень большой, а серийный номер JSON - неудачей. Я думаю, если это можно сделать, пользователи сделают это ... – Marko 27 July 2015 в 15:09
  • 3
    Опишите, где мы должны поместить этот код ... @Flea – Koray Durudogan 14 November 2016 в 13:05
  • 4
    @KorayDurudogan - я поместил это в метод Ajax, который возвращал ответ, поэтому в моем контроллере. Надеюсь, это поможет! – Flea 15 November 2016 в 20:42
  • 5
    Я не оспариваю ваш ответ, но пытаюсь лучше понять, какие лучшие подходы есть. У меня есть запрос, который в зависимости от того, какие критерии пользователя будет определять размер результата. Я возвращаю JsonResult, было бы важно, если бы я вернул файл excel? – eaglei22 20 March 2017 в 13:24

вы можете записать эту строку в Controller

json.MaxJsonLength = 2147483644;

, вы также можете записать эту строку в web.config

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

`

To be на безопасной стороне, используйте оба.

10
ответ дан Huey 20 August 2018 в 10:42
поделиться

Вы можете настроить максимальную длину для json-запросов в файле web.config:

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

Значение по умолчанию для maxJsonLength равно 102400. Дополнительные сведения см. на этой странице MSDN: http : //msdn.microsoft.com/en-us/library/bb763183.aspx

57
ответ дан Ian Boyd 20 August 2018 в 10:42
поделиться
  • 1
    Какое значение хранится в этом целочисленном значении? Это какой-то подсчет характера? Я предполагаю, что я спрашиваю, почему используется целое число? Благодаря! – eaglei22 20 March 2017 в 13:21
  • 2
    @ eaglei22 число представляет, сколько байтов может использоваться для maxJsonLength. Как упоминалось в M4N, 102400 по умолчанию (100 КБ). – Jacob Plonke 11 July 2017 в 12:25

Нам не нужны изменения на стороне сервера. вы можете исправить это только с помощью файла web.config Это помогло мне. попробуйте это

<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>

0
ответ дан isanka thalagala 20 August 2018 в 10:42
поделиться

Я решил проблему с добавлением этого кода:

String confString = HttpContext.Current.Request.ApplicationPath.ToString();
Configuration conf = WebConfigurationManager.OpenWebConfiguration(confString);
ScriptingJsonSerializationSection section = (ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization");
section.MaxJsonLength = 6553600;
conf.Save();
2
ответ дан jfabrizio 20 August 2018 в 10:42
поделиться
  • 1
    Это похоже на хакерское решение, но интересный подход. Я нашел это полезным спасибо! Для меня в контроллере apsnet mvc 5 мне пришлось удалить «Current» из пространства имен. Я сделал пару настроек: string confString = HttpContext.Request.ApplicationPath.ToString(); var conf = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(confString); var section = (System.Web.Configuration.ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization"); section.MaxJsonLength = int.MaxValue; conf.Save(); – ooXei1sh 19 March 2016 в 23:54

Я исправил его.

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

Он работает очень хорошо.

20
ответ дан Joseph Quinsey 20 August 2018 в 10:42
поделиться
  • 1
    Потрясающие! Это единственное решение, которое сработало для меня и в любом случае, так как это не глобальное изменение. Благодаря! – Sealer_05 6 November 2015 в 20:41

Альтернативный ASP.NET MVC 5 Fix:

(Mine похож на MFC ответ выше с небольшими изменениями)

Я не был готов к изменению на Json.NET пока что, и в моем случае ошибка произошла во время запроса. Наилучший подход в моем сценарии заключался в модификации фактического JsonValueProviderFactory, который применяет исправление к глобальному проекту, и может быть выполнен путем редактирования файла global.cs как такового.

JsonValueProviderConfig.Config(ValueProviderFactories.Factories);

добавить запись web.config :

<add key="aspnet:MaxJsonLength" value="20971520" />

, а затем создайте два следующих класса

public class JsonValueProviderConfig
{
    public static void Config(ValueProviderFactoryCollection factories)
    {
        var jsonProviderFactory = factories.OfType<JsonValueProviderFactory>().Single();
        factories.Remove(jsonProviderFactory);
        factories.Add(new CustomJsonValueProviderFactory());
    }
}

. Это в основном точная копия реализации по умолчанию, найденная в System.Web.Mvc, но с добавлением настраиваемого Значение привязки web.config aspnet:MaxJsonLength.

public class CustomJsonValueProviderFactory : ValueProviderFactory
{

    /// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
    /// <returns>A JSON value-provider object for the specified controller context.</returns>
    /// <param name="controllerContext">The controller context.</param>
    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        if (controllerContext == null)
            throw new ArgumentNullException("controllerContext");

        object deserializedObject = CustomJsonValueProviderFactory.GetDeserializedObject(controllerContext);
        if (deserializedObject == null)
            return null;

        Dictionary<string, object> strs = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
        CustomJsonValueProviderFactory.AddToBackingStore(new CustomJsonValueProviderFactory.EntryLimitedDictionary(strs), string.Empty, deserializedObject);

        return new DictionaryValueProvider<object>(strs, CultureInfo.CurrentCulture);
    }

    private static object GetDeserializedObject(ControllerContext controllerContext)
    {
        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            return null;

        string fullStreamString = (new StreamReader(controllerContext.HttpContext.Request.InputStream)).ReadToEnd();
        if (string.IsNullOrEmpty(fullStreamString))
            return null;

        var serializer = new JavaScriptSerializer()
        {
            MaxJsonLength = CustomJsonValueProviderFactory.GetMaxJsonLength()
        };
        return serializer.DeserializeObject(fullStreamString);
    }

    private static void AddToBackingStore(EntryLimitedDictionary backingStore, string prefix, object value)
    {
        IDictionary<string, object> strs = value as IDictionary<string, object>;
        if (strs != null)
        {
            foreach (KeyValuePair<string, object> keyValuePair in strs)
                CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);

            return;
        }

        IList lists = value as IList;
        if (lists == null)
        {
            backingStore.Add(prefix, value);
            return;
        }

        for (int i = 0; i < lists.Count; i++)
        {
            CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakeArrayKey(prefix, i), lists[i]);
        }
    }

    private class EntryLimitedDictionary
    {
        private static int _maximumDepth;

        private readonly IDictionary<string, object> _innerDictionary;

        private int _itemCount;

        static EntryLimitedDictionary()
        {
            _maximumDepth = CustomJsonValueProviderFactory.GetMaximumDepth();
        }

        public EntryLimitedDictionary(IDictionary<string, object> innerDictionary)
        {
            this._innerDictionary = innerDictionary;
        }

        public void Add(string key, object value)
        {
            int num = this._itemCount + 1;
            this._itemCount = num;
            if (num > _maximumDepth)
            {
                throw new InvalidOperationException("The length of the string exceeds the value set on the maxJsonLength property.");
            }
            this._innerDictionary.Add(key, value);
        }
    }

    private static string MakeArrayKey(string prefix, int index)
    {
        return string.Concat(prefix, "[", index.ToString(CultureInfo.InvariantCulture), "]");
    }

    private static string MakePropertyKey(string prefix, string propertyName)
    {
        if (string.IsNullOrEmpty(prefix))
        {
            return propertyName;
        }
        return string.Concat(prefix, ".", propertyName);
    }

    private static int GetMaximumDepth()
    {
        int num;
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers");
            if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
            {
                return num;
            }
        }
        return 1000;
    }

    private static int GetMaxJsonLength()
    {
        int num;
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonLength");
            if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
            {
                return num;
            }
        }
        return 1000;
    }
}
0
ответ дан Maxim Gershkovich 20 August 2018 в 10:42
поделиться

Я следовал за ответом и дошел до этого решения:

Когда мне нужно было отправить большой json в действие в контроллере, я получил бы знаменитую «Ошибка при десериализации с помощью JSON JavaScriptSerializer. длина строки превышает значение, установленное в свойстве maxJsonLength.\r\nПараметр: поставщик входных значений ".

То, что я сделал, это создать новый ValueProviderFactory, LargeJsonValueProviderFactory и установить MaxJsonLength = Int32.MaxValue в методе GetDeserializedObject

public sealed class LargeJsonValueProviderFactory : ValueProviderFactory
{
private static void AddToBackingStore(LargeJsonValueProviderFactory.EntryLimitedDictionary backingStore, string prefix, object value)
{
    IDictionary<string, object> dictionary = value as IDictionary<string, object>;
    if (dictionary != null)
    {
        foreach (KeyValuePair<string, object> keyValuePair in (IEnumerable<KeyValuePair<string, object>>) dictionary)
            LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);
    }
    else
    {
        IList list = value as IList;
        if (list != null)
        {
            for (int index = 0; index < list.Count; ++index)
                LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakeArrayKey(prefix, index), list[index]);
        }
        else
            backingStore.Add(prefix, value);
    }
}

private static object GetDeserializedObject(ControllerContext controllerContext)
{
    if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
        return (object) null;
    string end = new StreamReader(controllerContext.HttpContext.Request.InputStream).ReadToEnd();
    if (string.IsNullOrEmpty(end))
        return (object) null;

    var serializer = new JavaScriptSerializer {MaxJsonLength = Int32.MaxValue};

    return serializer.DeserializeObject(end);
}

/// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
/// <returns>A JSON value-provider object for the specified controller context.</returns>
/// <param name="controllerContext">The controller context.</param>
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
    if (controllerContext == null)
        throw new ArgumentNullException("controllerContext");
    object deserializedObject = LargeJsonValueProviderFactory.GetDeserializedObject(controllerContext);
    if (deserializedObject == null)
        return (IValueProvider) null;
    Dictionary<string, object> dictionary = new Dictionary<string, object>((IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase);
    LargeJsonValueProviderFactory.AddToBackingStore(new LargeJsonValueProviderFactory.EntryLimitedDictionary((IDictionary<string, object>) dictionary), string.Empty, deserializedObject);
    return (IValueProvider) new DictionaryValueProvider<object>((IDictionary<string, object>) dictionary, CultureInfo.CurrentCulture);
}

private static string MakeArrayKey(string prefix, int index)
{
    return prefix + "[" + index.ToString((IFormatProvider) CultureInfo.InvariantCulture) + "]";
}

private static string MakePropertyKey(string prefix, string propertyName)
{
    if (!string.IsNullOrEmpty(prefix))
        return prefix + "." + propertyName;
    return propertyName;
}

private class EntryLimitedDictionary
{
    private static int _maximumDepth = LargeJsonValueProviderFactory.EntryLimitedDictionary.GetMaximumDepth();
    private readonly IDictionary<string, object> _innerDictionary;
    private int _itemCount;

    public EntryLimitedDictionary(IDictionary<string, object> innerDictionary)
    {
        this._innerDictionary = innerDictionary;
    }

    public void Add(string key, object value)
    {
        if (++this._itemCount > LargeJsonValueProviderFactory.EntryLimitedDictionary._maximumDepth)
            throw new InvalidOperationException("JsonValueProviderFactory_RequestTooLarge");
        this._innerDictionary.Add(key, value);
    }

    private static int GetMaximumDepth()
    {
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers");
            int result;
            if (values != null && values.Length > 0 && int.TryParse(values[0], out result))
                return result;
        }
        return 1000;
    }
}

}

Затем в методе Application_Start из Global.asax.cs замените ValueProviderFactory новым:

protected void Application_Start()
{
    ...

    //Add LargeJsonValueProviderFactory
    ValueProviderFactory jsonFactory = null;
    foreach (var factory in ValueProviderFactories.Factories)
    {
        if (factory.GetType().FullName == "System.Web.Mvc.JsonValueProviderFactory")
        {
            jsonFactory = factory;
            break;
        }
    }

    if (jsonFactory != null)
    {
        ValueProviderFactories.Factories.Remove(jsonFactory);
    }

    var largeJsonValueProviderFactory = new LargeJsonValueProviderFactory();
    ValueProviderFactories.Factories.Add(largeJsonValueProviderFactory);
}
13
ответ дан MFA 20 August 2018 в 10:42
поделиться
  • 1
    Я сделал все, что мог, только ваш ответ спас мой день, это должно было быть принято ответ – Muhammad Waqas Aziz 5 August 2018 в 14:54
  • 2
    С помощью этого кода мы можем переопределить MVC-контроллер max json Deserializetion limit из 4 мб, но есть ли способ переопределить контроллер web-api max json Предел десериализации – Muhammad Waqas Aziz 6 August 2018 в 04:05

, если это значение maxJsonLength является int, то насколько велико его int 32bit / 64bit / 16bit .... Я просто хочу быть уверенным, какое максимальное значение я могу установить как my maxJsonLength

<scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>
-1
ответ дан mpho isaac Molelle 20 August 2018 в 10:42
поделиться

В 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
);
285
ответ дан R. Schreurs 20 August 2018 в 10:42
поделиться
  • 1
    Я могу подтвердить, что вышеупомянутое работает как шарм в MVC 4, спасибо fanisch. – Beyers 11 January 2013 в 12:42
  • 2
    Я тоже могу это подтвердить. Ввод этого кода внутри базового контроллера определенно является самым чистым подходом. – parliament 5 March 2013 в 11:13
  • 3
    Это также работает, просто добавляя «MaxJsonLength = Int32.MaxValue». к результату индивидуального действия. В случае, если изменение нежелательно для контроллера или проекта. – Hypnovirus 18 April 2013 в 03:57
  • 4
    Это лучший ответ. MaxJsonLength может быть настроен для каждого контроллера. – liang 7 September 2014 в 11:32
  • 5
    ПРЕДУПРЕЖДЕНИЕ: это решение отключает сжатие (если требуется) ответа. Добавьте этот фильтр к вашему действию: stackoverflow.com/questions/3802107/… – Gorgi Rankovski 22 December 2015 в 15:55

, если вы по-прежнему получаете ошибку после установки web.config следующим образом:

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

Я решил это, выполнив следующее:

   public ActionResult/JsonResult getData()
   {
      var jsonResult = Json(superlargedata, JsonRequestBehavior.AllowGet);
      jsonResult.MaxJsonLength = int.MaxValue;
      return jsonResult;
    }

Надеюсь, это поможет.

18
ответ дан Ravi Anand 20 August 2018 в 10:42
поделиться
  • 1
    Установка maxJsonLength в файле web.config бессмысленно, поэтому для jsonResult.MaxJsonLength должно быть достаточно (по крайней мере, для меня (MVC5)) – hormberg 18 May 2018 в 07:45

Просто наткнулся на это. Я получаю более 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
}

И добавьте свои записи во все, что вы делали с ними в первую очередь. Или просто подождите, пока все вызовы не закончатся и не соберет результаты вместе.

3
ответ дан vbullinger 20 August 2018 в 10:42
поделиться

Для тех, у кого есть проблемы с MVC3 с JSON, который автоматически десериализуется для связующего и является слишком большим, вот решение.

  1. Скопируйте код класса JsonValueProviderFactory из исходный код MVC3 в новый класс.
  2. Добавьте строку, чтобы изменить максимальную длину JSON до того, как объект будет десериализован.
  3. Замените класс JsonValueProviderFactory новым модифицированным классом.

Благодаря http://blog.naver.com/techshare/100145191355 и https://gist.github.com/DalSoft/1588818 для указания мне в правильном направлении, как это сделать. Последняя ссылка на первом сайте содержит полный исходный код для решения.

3
ответ дан vestigal 20 August 2018 в 10:42
поделиться

Если вы получаете эту ошибку из MiniProfiler в MVC, вы можете увеличить значение, установив свойство MiniProfiler.Settings.MaxJsonResponseSize на нужное значение. По умолчанию этот инструмент игнорирует значение, установленное в config.

MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

Предоставлено mvc-mini-profiler .

9
ответ дан WolfyUK 20 August 2018 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: