javascript对象最大大小限制

IT技术 javascript variable-length
2021-03-12 08:36:42

我正在尝试将 JavaScript 变量传递给服务器端 usingjquery.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 时,不附加后面的值。

看起来这有一些限制。

3个回答

字符串长度没有这样的限制。可以肯定的是,我刚刚测试创建了一个包含 60 兆字节的字符串。

问题很可能是您在 GET 请求中发送数据,因此它是在 URL 中发送的。不同的浏览器对 URL 有不同的限制,其中 IE 的最低限制约为 2 kB。为安全起见,在 GET 请求中发送的数据永远不应超过大约 1 KB。

要发送这么多数据,您必须改为在 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(',') + ']}';
+1 - 没有意识到它的+=性能不如数组.join()
2021-05-05 08:36:42
谢谢@Guffa!这不仅对解决问题有很大帮助..还获得了一些有用的见解..
2021-05-15 08:36:42

第一步总是首先确定问题出在哪里。您的标题和您的大部分问题似乎表明您在 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,我可以轻松处理超过一百万个字符的字符串:

字符串长度 = 9000
字符串长度 = 18000
字符串长度 = 36000
字符串长度 = 72000
字符串长度 = 144000
字符串长度 = 288000
字符串长度 = 576000
str.length = 1152000
str.length = 2304000
str.length = 4608000
str.length = 9216000
str.length = 18432000

...我敢肯定,我可以得到一个很大高于。

所以这与 JavaScript 中的长度限制无关。您还没有显示用于将数据发送到服务器的代码,但很可能您正在使用GET这意味着您遇到了 GET 请求的长度限制,因为GET参数放在查询字符串中。详情请看这里

您需要改为使用POSTPOST请求中,数据在请求正文中而不是在 URL 中,并且确实可以非常非常大。

你必须把它放在 web.config 中:

<system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization maxJsonLength="50000000" />
      </webServices>
    </scripting>
  </system.web.extensions>
就此而言,IIS 上的默认最大大小无论如何都类似于 4MB。而不是大于 9,000 字节而改变。
2021-05-02 08:36:42
因为大家都用IIS?
2021-05-14 08:36:42
默认值为 2097152 个字符,因此在这种情况下不能成为限制因素。msdn.microsoft.com/en-us/library/...
2021-05-14 08:36:42