JSON对象的最大大小是多少?

16

使用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个字符左右时会出错(当我说“出错”时,是指请求到达服务器时带有null $_POST)。

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

还有其他建议吗?


1
你能试着不要用字符串开始吗?也就是说,只需创建一个 JavaScript 对象,将其传递给 ajax 调用的 data 参数。看看会发生什么。 - rfunduk
2
请提供一个失败的JSON示例。比您发布的大5倍并不算太大。这可能是您的JSON字符串中的转义问题或结构问题。 - Asaph
1
不,我的意思是直接将对象传递给 data: 而不使用任何字符串化。将对象传递给 jQuery,它会将其转换为 JSON。如果仍然失败,则可能是像 pix0r 说的那样,服务器配置问题。 - rfunduk
1
@thenduks:jQuery不会将任何内容序列化为JSON。如果您向.ajax传递一个对象,则会为您生成标准的foo=1&bar=2请求正文/查询。如果OP想要JSON,则应使用JSON.stringify - Crescent Fresh
那么这个问题怎么解决? - Blaise
显示剩余3条评论
4个回答

6

这可能是由于服务器的配置问题导致的。检查php.ini文件中的 max_post_size 设置,并确保其足够大以发布您的数据。还要检查您的Web服务器设置 - Apache有一个 LimitRequestBody 指令,可能会导致您的问题。最后,请检查您的Web服务器和PHP错误日志,看看大型POST是否会触发任何错误。


我也这样想过,但它读取的是:post_max_size = 64M这是64兆字节,正确吗? - Tim
还要检查httpd.conf文件中的LimitRequestBody - pix0r
(仅返回已翻译的文本)(是的,64M等于64兆字节)。 - pix0r
我在httpd.conf中设置了“LimitRequestBody 0”(无限制),并重新启动了Apache。但是没有任何效果。还有其他的想法吗? - Tim
可能会限制您的浏览器 =) - Vladimir Ch

3
只是给其他遇到类似问题的人一些指针 - 我遇到了一个类似的问题,使用 jQuery.parseJSON() 无法解析 JSON 字符串。
我很尴尬地说,我的问题(可能与 OP 的问题无关)实际上是由于一个单引号走失造成的。转义它可以解决问题。起初我认为这是字符串长度相关的问题,因为它只在一个 8,000 字符长的 JSON 字符串中出现,但实际上是单引号在错误的位置终止了字符串。
Tim,我不知道你是否解决了你最初的问题,但是请粘贴你提供的字符串:
{"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":""}],}]}]}

http://json.parser.online.fr/ 中的内容输入后,如果有其他人遇到以下错误,这可能会有所帮助: SyntaxError: JSON.parse: expected double-quoted property name

一个匿名用户评论:数组后面有一个尾随逗号,这可能导致错误:..."Liberty","subteam":""}],}]}]}这不是正确的JSON格式。一些浏览器可以通过忽略尾随逗号来恢复,但有些无法解析它。 - Rup

2

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

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

还有一件事,在对编码后的Json字符串进行var_dump时,我可以看到它被截断了,Json标签没有被关闭,这就是为什么Json解码器返回null的原因。

例如:

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

你会看到字符串被截断的位置,并在输出的末尾拼接了“0”。

1
Ronald,你最终找到解决方案了吗?我遇到了完全相同的问题,尽管我的字符串在3127个字符处被截断。 - solefald

1

'jsonp' 数据类型不能使用 POST 方法。相反,所有数据都通过查询字符串传递。因此,如果服务器的最大查询字符串长度超过限制,则数据将无法传递。这是因为 jQuery 将 json 数据加载为 HTML 文档中的节点,并且只能使用 GET 方法进行加载。如果您需要更多数据,则必须使用 XML 或其他方法。


应该已经指定了(我认为是):通过向您的HTML文档添加<script>节点发送JSON请求。所有数据都通过查询字符串传递。例如:<script src="script.js?data1=example&data2=...无法在<script>标记中发送POST数据。因此,数据的大小受服务器对查询字符串/ URL的最大大小限制。 - intellitecture

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