Чи існує обмеження на кількість JSON?


163

Я використовую jquery, JSON та AJAX для системи коментарів. Мені цікаво, чи є обмеження розміру на те, що ви можете надсилати / зберігати через JSON? Як, якщо користувач набирає велику суму, і я надсилаю його через JSON, чи існує якийсь максимальний ліміт?

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


9
Будьте уважні, як ви тлумачите відповіді людей нижче! Більшість відповідей говорить, що обмеження для самого JSON немає. У той час як у більшості серверів буде встановлений ліміт. Я провів простий тест AJAX, де я збільшував байт при кожному відправці і приблизно на 8 К байт, він не вдався на декількох серверах PHP / Apache, які я намагався зараз. Помилка була: "414 (Запит-URI занадто великий)"
Jeach

3
Ми надійно надсилаємо / отримуємо корисні навантаження 100 кб на iOS / iPhone. Що слід остерігатись, це те, що багато протоколів отримують дані шматками, а спроба дезаріалізувати шматок замість того, щоб чекати, коли всі дані будуть отримані, призведе до невдачі, якщо тільки для вас не буде спеціально встановлена ​​ваша логіка десеріалізатора.
Гарячі лизання

1
@Jeach - Цей збій був майже напевне через те, що передача даних була розбита на 8K блоки, а потім не була належним чином зібрана на іншому кінці перед спробою розбору.
Гарячі лизання

1
@Jeach - це поширена помилка кодування. Чекаємо лише першого повідомлення відповіді від запиту проти очікування останнього та об'єднання даних відповіді разом. Кожна відповідь міститиме не більше 8 К, тому для більш тривалих даних використовується кілька відповідей.
Гарячі лизання

1
@Jeach - Якщо ви робите це в iOS, за допомогою стандартного NSURLConnectionh, вам потрібно реалізувати connectionDidFinishLoadingі зробити трансляцію JSON там (або після того, як це називається), а не в didReceiveData(де ви просто повинні з'єднати отримані дані з датою раніше отримано). Інші середовища схожі.
Гарячі лизання

Відповіді:


141

JSON схожий на інші формати даних, такі як XML - якщо вам потрібно передати більше даних, ви просто надішліть більше даних. Немає вродженого обмеження розміру для запиту JSON. Будь-яке обмеження встановлюється сервером, що розбирає запит. (Наприклад, ASP.NET має властивість "MaxJsonLength" серіалізатора.)


1
так технічно, Якби я хотів перенести цілий вихідний код на всю цю сторінку, він міг би бути надісланий як об'єкт json?
JasonDavis

Код цієї сторінки насправді лише 6,7 кб (без урахування зовнішніх ресурсів). Це легко зробити з будь-яким типом HTTP-запиту.
Бурштин

15
Можливо, варто відзначити, що "властивість за замовчуванням - 2097152 символів, що еквівалентно 4 Мб рядкових даних Unicode" для властивості, JavaScriptSerializer.MaxJsonLengthзазначеної у відповіді Амбер. (NB я цитував з MSDN )
dumbledad

То як би я розібрав об'єкт JSON 155kb?
Рей

2
@AsadHasan Сервер може проаналізувати або серіалізувати, залежно від того, в якому напрямку рухаються дані.
Бурштин

18

Немає фіксованого обмеження щодо того, наскільки великий блок даних JSON або будь-яке з полів.

Є обмеження щодо того, якою кількістю JSON може реалізувати JavaScript різних браузерів (наприклад, на моєму досвіді близько 40 Мб). Дивіться це питання для прикладу .


4
8K - це виключно невелика межа для JSON. Я підозрюю, що це не обмеження для JSON, але, скоріше, дані передаються в 8К-блоках, і код, що отримує дані, намагається десаріалізувати окремий блок, а не чекати, коли прийде весь корисний вантаж.
Гарячі лизання

Б'юсь у заклад, ви правильні гарячі лизання. Я оновив свою відповідь.
cdiggins

9

Це залежить від реалізації Вашого письменника / аналізатора JSON. Microsoft DataContractJsonSerializer, схоже, має жорсткий ліміт близько 8 кбіт (я думаю, 8192), і він буде помилковим для великих рядків.

Редагувати: нам вдалося вирішити обмеження 8K для рядків JSON, встановивши властивість MaxJsonLength у веб-конфігурації, як описано у цій відповіді: https://stackoverflow.com/a/1151993/61569


5
8K "межа" - це майже напевно межа блоку передачі даних, а не межа для документа JSON. Більш великі рядки можуть бути оброблені шляхом правильного повторного складання багатоблокової передачі.
Гарячі лизи

Минуло час, коли ми з'ясували, як змінити ліміт 8K у DataContractJsonSerializer, але я думаю, що це було налаштування "MaxJsonLength" ( msdn.microsoft.com/en-us/library/… )
Ентоні Ф

5

Дійсно немає обмежень щодо розміру даних JSON, які потрібно надіслати або отримати. Ми також можемо надсилати дані Json у файл. Відповідно до можливостей браузера, з яким ви працюєте, можна обробляти дані Json.


5

Реалізації можуть встановлювати обмеження для документів JSON, включаючи їх розмір, тому вибирайте свій аналізатор з розумом. Див. RFC 7159 , Розділ 9. Парсери:

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


3

Якщо ви працюєте з ASP.NET MVC, ви можете вирішити проблему, додавши до результату MaxJsonLength :

var jsonResult = Json(new
{
    draw = param.Draw,
    recordsTotal = count,
    recordsFiltered = count,
    data = result
}, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = int.MaxValue;

Але це робить макс приблизно 4 Мб, і нам це потрібно вище. Як ми могли впоратись із таким сценарієм?
Кейсі

@Casey - який симптом трапляється у вас понад 4 МБ? підписане 32-розрядне ціле число доходить до 2 мільярдів - десь інше обмежує ваш розмір. Значення за замовчуванням MaxJsonLength - 2M символів Unicode, тобто 4 Мб. Код вище збільшує MaxJsonLength до значно більшого значення. Можливо, int.MaxValueйого відхиляють як "занадто великий" - спробуйте інші розміри, і подивіться, наскільки ви можете отримати великі розміри.
ToolmakerSteve

Ви знаєте що, ви праві. Я, мабуть, отримує міхур помилки в плавці, або він не використовує налаштування. Я намагаюся зробити це попередньо контролером, а не за результатом. Коли я намагаюся надіслати об'єкт Json, який є великим для виклику контролера, якщо я використовую інструменти для розробників та налагоджую, що на сервері запиту повертається розмір, що перевищує обмеження Json.
Кейсі

Це моє питання, як обійти це на веб-сайті Microsoft. "В основному," внутрішній "JavaScriptSerializer поважає значення maxJsonLength при виклику з веб-методу. Безпосереднє використання JavaScriptSerializer (або використання через MVC-метод дій / Controller) не поважає властивість maxJsonLength, принаймні не з системиWebExtensions .scripting.webServices.jsonСеріялізаційний розділ, який ви визначаєте у файлі web.config. "
Кейсі

Мені майже не цікаво, чи можу я сказати, розбити щось понад 50 тис. На шматки, як List <type string>, а потім надіслати це контролеру та зробити папку рядків, а потім імпортувати в SQL.
Кейсі

2

Звичайно, кожен тут пропустив хитрість. Поточний ліміт розміру файлу json становить 18,446,744,073,709,551,616 символів або якщо ви віддаєте перевагу байти, або навіть 2 ^ 64 байти, якщо ви принаймні шукаєте 64-бітову інфраструктуру.

Для всіх намірів і цілей, ми можемо вважати, що це необмежено, оскільки вам, мабуть, буде важко зачепити цю проблему ...


-6

Максимальна довжина струн JSON. За замовчуванням - 2097152 символів, що еквівалентно 4 Мб рядкових даних Unicode.

Посилання нижче 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вже розглянуто в інших відповідях.
Девід Макогон

Чи може хто-небудь розмістити, як впоратися з більшою, ніж. Наприклад, як я можу надіслати великий json на контролер MVC, але використовувати серіалізатор Newtonsoft для обробки цього чи це неможливо, оскільки він вбудований у .NET і використовується попередній контролер, який потрапляє?
Кейсі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.