Есть ли ограничение на количество JSON?

163

Я использую jquery, JSON и AJAX для системы комментариев. Мне любопытно, есть ли ограничение на размер того, что вы можете отправить через / сохранить с JSON? Например, если пользователь вводит большое количество, а я отправляю его через JSON, есть ли какое-то максимальное ограничение?

Также можно отправлять любой текст через JSON. например, когда-нибудь я позволю пользователям использовать HTML, это будет хорошо?

JasonDavis
источник
9
Будьте осторожны, как вы интерпретируете ответы людей ниже! Большинство ответов говорят, что нет никаких ограничений для самого JSON. Хотя большинство серверов будут иметь настраиваемый лимит. Я выполнил простой тест AJAX, в котором я увеличивал байт при каждой отправке, и примерно на 8 Кбайт он не удался на нескольких серверах PHP / Apache, которые я пробовал сейчас. Ошибка была: «414 (Request-URI Too Large)»
Jeach
3
Мы надежно отправляем / получаем 100 КБ полезных нагрузок на iOS / iPhone. Стоит остерегаться того, что многие протоколы получают данные порциями, и попытка десериализации порции вместо ожидания получения всех данных приведет к сбою, если логика десериализатора специально не настроена для этого.
Hot Licks
1
@Jeach - Этот сбой почти наверняка был вызван тем, что передача данных была разбита на блоки по 8 КБ, а затем неправильно собрана на другом конце перед попыткой анализа.
Hot Licks
1
@Jeach - это распространенная ошибка кодирования. Ожидание только первого ответного сообщения из запроса против ожидания последнего и объединения данных ответа вместе. Каждый ответ будет содержать не более 8 КБ, поэтому для более длинных данных используется несколько ответов.
Hot Licks
1
@Jeach - если вы делаете это в iOS со стандартным NSURLConnectionh, вам нужно реализовать connectionDidFinishLoadingи выполнить перевод JSON там (или после этого вызывается), а не в didReceiveData(где вы должны просто объединить полученные данные с датой ранее получили). Другие среды похожи.
Hot Licks

Ответы:

141

JSON похож на другие форматы данных, такие как XML - если вам нужно передавать больше данных, вы просто отправляете больше данных. Для запроса JSON нет ограничений по размеру. Любое ограничение будет установлено сервером, анализирующим запрос. (Например, ASP.NET имеет свойство «MaxJsonLength» сериализатора.)

янтарный
источник
1
так технически, если бы я хотел перенести ВСЕ исходный код на всю эту страницу, он мог бы быть отправлен как объект json?
JasonDavis
Код этой страницы на самом деле всего 6,7 КБ (не считая внешних ресурсов). Это легко сделать практически любым HTTP-запросом.
Amber
15
Возможно, стоит отметить, что «значение по умолчанию составляет 2097152 символа, что эквивалентно 4 МБ строковых данных Юникода» для свойства, JavaScriptSerializer.MaxJsonLengthуказанного в ответе Амбер. (NB я
цитирую
Итак, как бы я проанализировал 155-килобайтный объект JSON?
Рэй
2
@AsadHasan Сервер может анализировать или сериализовать, в зависимости от направления передачи данных.
Янтарь
18

Не существует фиксированного ограничения на размер блока данных JSON или любого из полей.

Существуют ограничения на то, сколько JSON может обрабатывать реализация JavaScript в различных браузерах (например, около 40 МБ в моем опыте). Смотрите этот вопрос для примера .

cdiggins
источник
4
8K - это исключительно маленький предел для JSON. Я подозреваю, что это не предел для JSON, а скорее данные передаются в блоках по 8 Кбайт, и код, принимающий данные, пытается десериализовать отдельный блок, а не ждать получения всей полезной нагрузки.
Hot Licks
Могу поспорить, что вы правы Hot Licks. Я обновил свой ответ.
cdiggins
9

Это зависит от реализации вашего писателя / анализатора JSON. Microsoft DataContractJsonSerializer, кажется, имеет жесткое ограничение около 8 КБ (я думаю, что 8192), и он будет ошибаться для больших строк.

Изменить: Мы смогли разрешить ограничение 8K для строк JSON, установив свойство MaxJsonLength в веб-конфигурации, как описано в этом ответе: https://stackoverflow.com/a/1151993/61569

Энтони Ф
источник
5
«Ограничение» в 8 КБ почти наверняка является границей блока передачи данных, а не пределом для документа JSON. Большие строки могут быть обработаны путем правильной сборки многоблочной передачи.
Hot Licks
Прошло много времени с тех пор, как мы выяснили, как изменить ограничение 8 КБ в DataContractJsonSerializer, но я думаю, что это был параметр «MaxJsonLength» ( msdn.microsoft.com/en-us/library/… )
Энтони Ф,
5

На самом деле нет никаких ограничений на размер данных JSON для отправки или получения. Мы также можем отправить данные Json в файл. В зависимости от возможностей браузера, с которым вы работаете, данные Json могут обрабатываться.

Чайтанья Белсаре
источник
5

Реализации могут свободно устанавливать ограничения на документы JSON, включая размер, поэтому выбирайте свой синтаксический анализатор с умом. См. RFC 7159 , Раздел 9. Парсеры:

«Реализация может устанавливать ограничения на размер текстов, которые она принимает. Реализация может устанавливать ограничения на максимальную глубину вложенности. Реализация может устанавливать ограничения на диапазон и точность чисел. Реализация может устанавливать ограничения на длину и символ содержимое строк. "

stleary
источник
3

Если вы работаете с ASP.NET MVC, вы можете решить эту проблему, добавив MaxJsonLength к вашему результату:

var jsonResult = Json(new
{
    draw = param.Draw,
    recordsTotal = count,
    recordsFiltered = count,
    data = result
}, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = int.MaxValue;
mathias.horn
источник
Но это делает максимум примерно 4 МБ, и нам это нужно выше. Как мы можем справиться с этим сценарием?
Кейси
@Casey - какой симптом случается у вас за пределами 4MB? знаковое 32-разрядное целое число достигает 2 миллиардов - должно быть что-то еще, что ограничивает ваш размер. Значение по умолчанию MaxJsonLength составляет 2 МБ символов Юникода, поэтому 4 МБ. Код выше увеличивает MaxJsonLength до гораздо большего значения. Может быть int.MaxValue, отклонен как «слишком большой» - попробуйте другие размеры, и посмотрите, насколько большой вы можете получить.
ToolmakerSteve
Вы знаете, что вы правы. Возможно, я получаю всплывающую ошибку, или она не использует настройку. Я пытаюсь сделать этот предварительный контроллер, а не на результат. Когда я пытаюсь отправить большой объект Json на вызов контроллера, если я использую инструменты разработчика и отлаживаю, серверная часть запроса возвращает размер, превышающий предел Json.
Кейси
Это моя проблема, как обойти это на веб-сайте Microsoft. «По сути,« внутренний »JavaScriptSerializer учитывает значение maxJsonLength при вызове из веб-метода. Прямое использование JavaScriptSerializer (или использование через метод действия MVC / Controller) не уважает свойство maxJsonLength, по крайней мере, не из systemWebExtensions Раздел .scripting.webServices.jsonSerialization, который вы определяете в файле web.config. "
Кейси
Я почти задаюсь вопросом, могу ли я сказать, разбить что-нибудь более 50k на куски, такие как List <type string>, затем отправить это контроллеру, выполнить строковое заполнение, а затем импортировать в SQL.
Кейси
2

Конечно, все здесь упустили трюк. Текущий предел размера файла json составляет 18 446 744 073 709 551 616 символов, или, если вы предпочитаете байты, или даже 2 ^ 64 байта, если вы рассматриваете как минимум 64-битные инфраструктуры.

В любом случае, мы можем предположить, что он неограничен, поскольку вам, вероятно, будет трудно решить эту проблему ...

Perfect64
источник
-6

Максимальная длина строк JSON. По умолчанию используется 2097152 символа, что эквивалентно 4 МБ строковых данных Юникода.

См ниже URL

https://docs.microsoft.com/en-us/dotnet/api/system.web.script.serialization.javascriptserializer.maxjsonlength?view=netframework-4.7.2

Шаши Кешар
источник
2
Сам JSON не имеет внутреннего ограничения. То, что вы опубликовали, относится к .net и его JavaScriptSerializerклассу. И MaxJsonLengthуже были рассмотрены в других ответах.
Дэвид Макогон,
Может кто-нибудь опубликовать, как обрабатывать больше, чем .NET JavaScriptSerializer? Например, как я могу отправить большой json на контроллер MVC, но использовать для этого сериализатор Newtonsoft или это невозможно, поскольку он встроен в .NET и используется предварительный контроллер?
Кейси