Максимальный размер объекта javascript

Я пытаюсь передать переменную JavaScript на сервер с помощью метода jquery.ajax.

Я пытаюсь создать строку json, но когда длина переменной достигает 10000, в строку добавляется больше данных.

var jsonObj = '{"code":"' + code + '","defaultfile":"' + defaultfile + '","filename":"' + currentFile + '","lstResDef":[';
        $.each(keys, function(i, item) {
            i = i + 1;
            var value = $("#value" + i).val();
            var value = value.replace(/"/g, "\\\"");
            jsonObj = jsonObj + '{';
            jsonObj = jsonObj + '"Key":' + '"' + Encoder.htmlEncode($(this).html()) + '"' + "," + '"Value"' + ':' + '"' + Encoder.htmlEncode(value) + '"';
            jsonObj = jsonObj + '},';
            alert(jsonObj);             
        });          

        jsonObj = jsonObj + ']}';

Здесь, когда длина символа var jsonObj равна 10000, следующие значения не добавляются.

Похоже, что есть некоторый предел.

Ответ 1

Нет такого предела для длины строки. Чтобы быть уверенным, я просто тестировал создание строки, содержащей 60 мегабайт.

Вероятно, проблема заключается в том, что вы отправляете данные в GET-запрос, поэтому он отправляется в URL-адрес. Различные браузеры имеют разные ограничения для URL-адреса, где IE имеет самый низкий лимитер около 2 кБ. Чтобы быть в безопасности, вы никогда не должны отправлять больше данных, чем примерно килобайт в запросе GET.

Чтобы отправить столько данных, вы должны отправить его в POST-запросе. У браузера нет жесткого ограничения на размер сообщения, но у сервера есть ограничение на то, насколько большой может быть запрос. Например, IIS имеет предел по умолчанию 4 МБ, но можно настроить ограничение, если вам когда-нибудь понадобится отправить больше данных, чем это.

Кроме того, вы не должны использовать + = для конкатенации длинных строк. Для каждой итерации все больше и больше данных перемещается, поэтому он становится все медленнее и медленнее, чем больше предметов, которые у вас есть. Поместите строки в массив и соедините все предметы сразу:

var items = $.map(keys, function(item, i) {
  var value = $("#value" + (i+1)).val().replace(/"/g, "\\\"");
  return
    '{"Key":' + '"' + Encoder.htmlEncode($(this).html()) + '"' + ",'+
    '" + '"Value"' + ':' + '"' + Encoder.htmlEncode(value) + '"}';
});
var jsonObj =
  '{"code":"' + code + '",'+
  '"defaultfile":"' + defaultfile + '",'+
  '"filename":"' + currentFile + '",'+
  '"lstResDef":[' + items.join(',') + ']}';

Ответ 2

Шаг 1 всегда должен определить, где лежит проблема. Ваше название и большая часть вашего вопроса, похоже, предполагают, что вы используете довольно малую длину для длины строки в JavaScript/в браузерах, невероятно низкий предел. Вы не. Рассмотрим:

var str;

document.getElementById('theButton').onclick = function() {
  var build, counter;

  if (!str) {
    str = "0123456789";
    build = [];
    for (counter = 0; counter < 900; ++counter) {
      build.push(str);
    }
    str = build.join("");
  }
  else {
    str += str;
  }
  display("str.length = " + str.length);
};

Живая копия

Повторное нажатие соответствующей кнопки продолжает делать строку длиннее. С Chrome, Firefox, Opera, Safari и IE у меня не было проблем с строками длиной более миллиона символов:

str.length = 9000
str.length = 18000
str.length = 36000
str.length = 72000
str.length = 144000
str.length = 288000
str.length = 576000
str.length = 1152000
str.length = 2304000
str.length = 4608000
str.length = 9216000
str.length = 18432000

... и я совершенно уверен, что смог бы получить намного больше.

Таким образом, это не имеет никакого отношения к пределу длины в JavaScript. Вы не показываете свой код для отправки данных на сервер, но, скорее всего, используете GET, что означает, что вы используете ограничение длины запроса GET, потому что в запрос помещаются параметры GET строка. Подробности здесь.

Вместо этого вам нужно переключиться на использование POST. В запросе POST данные находятся в теле запроса, а не в URL-адресе, и могут быть очень и очень большими.

Ответ 3

вы должны поместить это в web.config:

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