JSON对象最大大小?

Posted

技术标签:

【中文标题】JSON对象最大大小?【英文标题】:JSON object max size? 【发布时间】:2010-12-05 09:55:24 【问题描述】:

使用 jquery,我可以使用 ajax 将 json 对象从客户端发送到服务器,如下所示:

var strJSON = '"event":[
    "dates":[
        "2009-10-14","2009-10-15"],
   "teams":[
        "id":"0","country":"USA","state":"CA","name":"California Polytechnic State University","subteam":"",
        "id":"1","country":"USA","state":"CA","name":"California State University, Bakersfield","subteam":"",
        "id":"2","country":"USA","state":"CA","name":"California State University, Fresno","subteam":"",
        "id":"3","country":"USA","state":"CA","name":"California State University, Fullerton","subteam":""]
]';

$.ajax(
    url: '../ajax/save_event',
    type: 'POST',
    data:  data : strJSON ,
    dataType: 'json',
    timeout: 8000,
    cache: false
);

效果很好。但是如果 JSON 字符串变得更大(不确定确切的大小,但大约大 5 倍),服务器接收到的 $_POST 数据是空的。有人知道为什么吗?

我正在使用 Apache/php/jquery。它发生在 IE 和 Firefox 中。是否有需要调整的配置设置?

这是一个无法通过的字符串示例:

"events":["dates":["2009-10-10","2009-10-11","2009-10-12"],"divisions":["level":"Collegiate","name":"Varsity","subdivision":"Division I","rounds":[],"teams":["id":"0","country":"USA","state":"CA","name":"California Polytechnic State University","subteam":"","id":"1","country":"USA","state":"CA","name":"California State University, Bakersfield","subteam":"","id":"2","country":"USA","state":"CA","name":"California State University, Fresno","subteam":"","id":"3","country":"USA","state":"CA","name":"California State University, Fullerton","subteam":"","id":"4","country":"USA","state":"CA","name":"Stanford University","subteam":"","id":"5","country":"USA","state":"CA","name":"University of California, Davis","subteam":"","id":"6","country":"USA","state":"CA","name":"San Francisco State University","subteam":"","id":"7","country":"USA","state":"CA","name":"Lassen Community College","subteam":"","id":"8","country":"USA","state":"CA","name":"Menlo College","subteam":"","id":"9","country":"USA","state":"CA","name":"Fresno Pacific University","subteam":"","id":"10","country":"USA","state":"CA","name":"Bakersfield","subteam":"","id":"11","country":"USA","state":"CA","name":"Buchanan","subteam":"","id":"12","country":"USA","state":"CA","name":"Campolindo-Moraga","subteam":"","id":"13","country":"USA","state":"CA","name":"Fremont-Sunnyvale","subteam":"","id":"14","country":"USA","state":"CA","name":"Ponderosa-Shingle Springs","subteam":"","id":"15","country":"USA","state":"CA","name":"West Covina","subteam":"","id":"16","country":"USA","state":"CA","name":"Gilroy","subteam":"","id":"17","country":"USA","state":"CA","name":"San José State University","subteam":"","id":"18","country":"USA","state":"CA","name":"University of California, Los Angeles","subteam":"","id":"19","country":"USA","state":"CA","name":"Sierra College","subteam":"","id":"20","country":"USA","state":"CA","name":"Selma","subteam":"","id":"21","country":"USA","state":"CA","name":"Liberty","subteam":""],]]

它是使用 json.org 的“stringify”创建的:

var strJSON = JSON.stringify(oEvent);

编辑: 进一步调查后,我将 dataType 更改为“text”并尝试发送一长串数字。它可以工作到大约 3500 个字符然后阻塞(当我说“阻塞”时,我的意思是请求以空 $_POST 到达服务器。)

我的 PHP post_max_size 是 64M,所以不是这样。有人建议使用 httpd.conf 中没有的 Apache 的“LimitRequestBody”,所以我在其中添加了“LimitRequestBody 0”并重新启动了 Apache。这也没有帮助。

还有什么建议???

【问题讨论】:

你可以试试让它不是一个字符串开始吗?例如,只需将一个 javascript 对象传递给 ajax 调用的 data 参数即可。看看会发生什么。 请发布 JSON 失败的示例。比您发布的内容大 5 倍并没有那么大。这可能是您的 JSON 字符串中的转义问题或结构问题。 好吧,我只是在上面添加了一个示例。它是用 stringify() 创建的。 不不,我的意思是直接将对象传递给data:,而不是使用任何类型的字符串化。将 jQuery 传递给 Object,它会将其转换为 JSON。如果仍然失败,那可能是 pix0r 所说的,服务器配置问题。 @thenduks:jQuery 不会将任何内容序列化为 JSON。如果您传递.ajax 一个对象,您将获得为您生成的标准foo=1&bar=2 请求正文/查询。如果 OP 想要 JSON,那么 JSON.stringify 是要走的路。 【参考方案1】:

这可能与您的服务器配置有关。检查 php.ini 中的设置 max_post_size 并确保它足够大以发布您的数据。还要检查您的 Web 服务器设置 - Apache 有一个 LimitRequestBody 指令,这可能会导致您的问题。最后,检查你的 web 服务器和 PHP 错误日志,看看大帖子是否触发了任何错误。

【讨论】:

我也这么认为,但它是这样写的:post_max_size = 64M 那是 64 兆字节,对吗? 同时检查 httpd.conf 中的LimitRequestBody (是的,64M == 64 MB)。 我在 httpd.conf 中设置了“LimitRequestBody 0”(无限制)并重新启动了 Apache。它没有效果。还有其他想法吗? 可能是您浏览器的限制 =)【参考方案2】:

只有几个指向找到此页面的其他人的指针 - 我遇到了一个类似的问题,即无法使用 jQuery.parseJSON() 解析 JSON 字符串。

我很尴尬地说我的问题(可能与 OP 的问题无关)实际上是由一个流浪的单引号引起的。逃脱它解决了这个问题。我最初认为它与字符串长度有关,因为它似乎只发生在 8,000 个字符长的 JSON 字符串中,但它是在错误的位置终止字符串的杂散引号。

蒂姆,我不知道您是否曾经深入了解原始问题,但粘贴您提供的字符串:

"events":["dates":["2009-10-10","2009-10-11","2009-10-12"],"divisions":["level":"Collegiate","name":"Varsity","subdivision":"Division I","rounds":[],"teams":["id":"0","country":"USA","state":"CA","name":"California Polytechnic State University","subteam":"","id":"1","country":"USA","state":"CA","name":"California State University, Bakersfield","subteam":"","id":"2","country":"USA","state":"CA","name":"California State University, Fresno","subteam":"","id":"3","country":"USA","state":"CA","name":"California State University, Fullerton","subteam":"","id":"4","country":"USA","state":"CA","name":"Stanford University","subteam":"","id":"5","country":"USA","state":"CA","name":"University of California, Davis","subteam":"","id":"6","country":"USA","state":"CA","name":"San Francisco State University","subteam":"","id":"7","country":"USA","state":"CA","name":"Lassen Community College","subteam":"","id":"8","country":"USA","state":"CA","name":"Menlo College","subteam":"","id":"9","country":"USA","state":"CA","name":"Fresno Pacific University","subteam":"","id":"10","country":"USA","state":"CA","name":"Bakersfield","subteam":"","id":"11","country":"USA","state":"CA","name":"Buchanan","subteam":"","id":"12","country":"USA","state":"CA","name":"Campolindo-Moraga","subteam":"","id":"13","country":"USA","state":"CA","name":"Fremont-Sunnyvale","subteam":"","id":"14","country":"USA","state":"CA","name":"Ponderosa-Shingle Springs","subteam":"","id":"15","country":"USA","state":"CA","name":"West Covina","subteam":"","id":"16","country":"USA","state":"CA","name":"Gilroy","subteam":"","id":"17","country":"USA","state":"CA","name":"San José State University","subteam":"","id":"18","country":"USA","state":"CA","name":"University of California, Los Angeles","subteam":"","id":"19","country":"USA","state":"CA","name":"Sierra College","subteam":"","id":"20","country":"USA","state":"CA","name":"Selma","subteam":"","id":"21","country":"USA","state":"CA","name":"Liberty","subteam":""],]]

into http://json.parser.online.fr/ 给出以下错误,如果这对其他人有任何帮助:

SyntaxError: JSON.parse: expected double-quoted property name

【讨论】:

An anonymous user comments:数组后面有一个逗号,可能导致此错误:..."Liberty","subteam":""],]] 这是不正确的 JSON。有些浏览器可以通过忽略尾随逗号来恢复,但有些浏览器无法解析它。【参考方案3】:

似乎存在大小问题,在测试我的 Json 字符串时,当字符串很小时一切正常,当我增加字符串(要编码的 php 数组)时,Json 字符串的输出被截断。

在对失败的字符串进行字符串长度处理时,我得到 (7796) 。因此,我将 cli 和 apache 的 ini 文件中的 max post 选项更改为 64M 而不是 8M,但我仍然遇到同样的问题。我不认为这个问题仅限于 apache LimitRequestBody,因为 php 在 CLI 上给出了相同的输出。

还有一件事,当对编码的 json 字符串执行 var_dump 时,我可以看到它何时被截断并且 json 标签没有关闭,因此 Json 解码器返回 null。

例如

$strJson = file_get_contents('http://mydomain/page');
var_dump($strJson);

您将看到字符串被截断的位置,并且将零连接到输出的末尾。

【讨论】:

Ronald,你有没有找到解决办法?我面临完全相同的问题,尽管我的字符串在 3127 个字符处被截断【参考方案4】:

'jsonp' 数据类型没有也不能使用 POST 方法。相反,所有数据都在查询字符串中传递。因此,如果超过服务器的最大查询字符串长度,数据将不会被传递。这样做的原因是 jQuery 将 json 数据作为节点加载到您的 html 文档中,而这只能作为 GET 来完成。如果您需要更多数据,则必须使用 XML 或其他。

【讨论】:

应该指定(以为我做到了):通过将

以上是关于JSON对象最大大小?的主要内容,如果未能解决你的问题,请参考以下文章

响应浏览器的最大 json 大小

cookie超过最大长度限制如何解决

序列化还是JSON存储对象?

获取 JSON 对象的大小

具有不同索引大小的 JSON 对象的架构

获取嵌套 JSON 对象的最小值和最大值