JavaScript对象的最大大小限制

41

我正试图使用jquery.ajax方法将JavaScript变量传递到服务器端。

我尝试创建一个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 + ']}';

在这里,当变量jsonObj的字符长度为10000时,其后的值不会被添加。

看起来有一些限制。

3个回答

69

字符串长度没有限制。为了确定,我刚刚测试了创建一个包含60兆字节的字符串。

问题可能是你正在使用GET请求发送数据,因此数据被发送到URL中。不同的浏览器对URL有不同的限制,其中IE的限制最低约为2 kB。为了安全起见,在GET请求中,您应该永远不要发送超过约1千字节的数据。

如果要发送大量数据,您必须改用POST请求。浏览器对POST的大小没有硬性限制,但服务器对请求大小有限制。例如,IIS具有默认限制为4 MB,但如果您需要发送更多数据,可以调整该限制。

此外,您不应该使用"+="来连接长字符串。每次迭代都会有越来越多的数据需要移动,所以随着项目数量的增加,速度会变得越来越慢。将字符串放入数组中,并一次性连接所有项目:

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(',') + ']}';

谢谢@Guffa!这不仅解决了问题,还获得了一些有用的见解。 - Paras
9
+1 - 没有意识到 += 操作比使用数组的 .join() 方法效率更低。 - chrisfrancis27

8

第一步始终是首先确定问题所在。您的标题和大部分问题似乎表明,您在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中,可以非常大。


-9

你需要将这个放在 web.config 文件中:

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

14
因为每个人都使用IIS? - T.J. Crowder
1
而且,就此事而言,在 IIS 上的默认最大大小大约是 4MB。比 9,000 字节和其余部分要大得多。 - T.J. Crowder
默认值为2097152个字符,因此在这种情况下它不能成为限制因素。http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.maxjsonlength.aspx - Guffa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接