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

Используя jquery, я могу отправлять объекты json с клиента на сервер с помощью ajax следующим образом:

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);

EDIT: Исследуя далее, я изменил dataType на "текст" и попытался отправить длинную строку чисел. Он работает до ~ 3500 символов, затем задыхается (и когда я говорю "дроссель", я имею в виду, что запрос поступает на сервер с нулевым значением $_POST.)

Мой PHP post_max_size - 64M, так что не он. Кто-то предложил использовать Apache "LimitRequestBody", которого не было в httpd.conf, поэтому я добавил ему "LimitRequestBody 0" и перезагрузил Apache. Это тоже не помогло.

Любые другие предложения

Ответы

Ответ 1

Возможно, это связано с конфигурацией вашего сервера. Проверьте php.ini для настройки max_post_size и убедитесь, что он достаточно велик для публикации ваших данных. Также проверьте настройки своего веб-сервера. У Apache есть директива LimitRequestBody, которая может вызвать проблемы. Наконец, проверьте журналы веб-сервера и PHP, чтобы узнать, вызывает ли большая почта какие-либо ошибки.

Ответ 2

Просто пара указателей на всех, кто находит эту страницу - я столкнулся с аналогичной проблемой, когда строка JSON не была проанализирована с помощью jQuery.parseJSON().

Я смущен, чтобы сказать, что моя проблема (вероятно, не связанная с проблемой OP) была фактически вызвана бродячей одиночной цитатой. Сбежав, он решил проблему. Я первоначально думал, что это связанная длина строки, поскольку это только казалось, что это происходит с длиной JSON длиной 8000 символов, но это была бродячая цитата, заканчивающая строку в неправильном месте.

Тим, я не знаю, если вы когда-нибудь дошли до сути своей исходной проблемы, но вставляете строку, которую вы указали:

{"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

Ответ 3

Кажется, что есть проблема с размером, при тестировании моей строки Json все работает, когда строка мала, когда я увеличиваю строку (php-массив, который нужно закодировать), вывод строки Json прерывается.

при выполнении строковой длины в неудавшейся строке я получаю (7796). Поэтому я изменил параметр max post в файле ini как для cli, так и apache до 64M вместо 8M, и я все еще получаю ту же проблему. Я не думаю, что эта проблема ограничена apache LimitRequestBody, поскольку php дает тот же результат в CLI.

Еще одна вещь, когда вы делаете var_dump в закодированной строке json, я могу видеть, когда она обрушивается, и json-теги не закрываются, поэтому почему-то декодер Json возвращает нуль.

e.g

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

Вы увидите, где строка прерывается, а нуль конкатенируется до конца вывода.

Ответ 4

'jsonp' datatype не использует метод POST и не может использовать его. Вместо этого все данные передаются в строке запроса. Таким образом, если длина строки запроса сервера max превышена, данные не будут переданы. Причина этого в том, что jQuery загружает json-данные как node в ваш html-документ, и это можно сделать только как GET. Если вам нужно больше данных, вам придется использовать XML или другие.