Czy istnieje ograniczenie ilości danych JSON?

163

Używam jquery, JSON i AJAX do systemu komentarzy. Ciekaw jestem, czy istnieje ograniczenie rozmiaru tego, co można przesyłać / przechowywać w formacie JSON? Na przykład, jeśli użytkownik wpisze dużą kwotę i wyślę ją przez JSON, czy istnieje jakiś maksymalny limit?

Przez JSON można również wysyłać dowolny tekst. na przykład czasami zezwalam użytkownikom na używanie html, czy to będzie w porządku?

JasonDavis
źródło
9
Uważaj, jak interpretujesz odpowiedzi ludzi poniżej! Większość odpowiedzi mówi, że sam „JSON” nie ma ograniczeń. Większość serwerów będzie miała konfigurowalny limit. Przeprowadziłem prosty test AJAX, w którym zwiększałem bajt przy każdym wysyłaniu, a przy około 8 KB nie powiodło się na kilku serwerach PHP / Apache, których teraz próbowałem. Błąd: „414 (żądanie-URI zbyt duże)”
Jeach
3
Niezawodnie wysyłamy / odbieramy 100kb ładunków na iOS / iPhone. Coś, na co należy uważać, to fakt, że wiele protokołów odbiera dane w fragmentach, a próba deserializacji fragmentu zamiast oczekiwania na odebranie wszystkich danych zakończy się niepowodzeniem, chyba że logika deserializatora jest specjalnie do tego skonfigurowana.
Hot Licks
1
@Jeach - ta awaria była prawie na pewno spowodowana rozbiciem transmisji danych na bloki 8K, a następnie niepoprawnym ponownym złożeniem na drugim końcu przed próbą analizy.
Hot Licks,
1
@Jeach - jest to typowy błąd kodowania. Oczekiwanie tylko na pierwszą wiadomość odpowiedzi z żądania vs oczekiwanie na ostatnią i łączenie razem danych odpowiedzi. Każda odpowiedź będzie zawierać maksymalnie 8 KB, więc w przypadku dłuższych danych używane są odpowiedzi wielokrotne.
Hot Licks,
1
@Jeach - Jeśli robisz to w iOS, ze standardowym NSURLConnectionh, musisz zaimplementować connectionDidFinishLoadingi wykonać tłumaczenie JSON tam (lub później), a nie w didReceiveData(gdzie powinieneś po prostu połączyć otrzymane dane z poprzednią datą Odebrane). Inne środowiska są podobne.
Hot Licks,

Odpowiedzi:

141

JSON jest podobny do innych formatów danych, takich jak XML - jeśli chcesz przesłać więcej danych, po prostu wysyłasz więcej danych. Żądanie JSON nie ma żadnego wewnętrznego ograniczenia rozmiaru. Wszelkie ograniczenia byłyby ustawiane przez serwer analizujący żądanie. (Na przykład ASP.NET ma właściwość „MaxJsonLength” serializatora).

Bursztyn
źródło
1
więc technicznie rzecz biorąc, gdybym chciał wziąć CAŁY kod źródłowy do całej tej strony, mógłby zostać wysłany jako obiekt json?
JasonDavis
Kod tej strony ma w rzeczywistości tylko 6,7kb (nie licząc zasobów zewnętrznych). Można to łatwo zrobić za pomocą dowolnego typu żądania HTTP.
Amber
15
Warto zauważyć, że „wartość domyślna to 2097152 znaków, co odpowiada 4 MB danych w postaci ciągu znaków Unicode” dla właściwości JavaScriptSerializer.MaxJsonLengthwymienionej w odpowiedzi Amber. (NB cytowałem z MSDN )
dumbledad
Jak więc przeanalizować obiekt JSON 155kb?
Ray
2
@AsadHasan Serwer może analizować lub serializować, w zależności od kierunku danych.
Bursztyn
18

Nie ma ustalonego limitu wielkości bloku danych JSON ani któregokolwiek z pól.

Istnieją ograniczenia co do tego, ile JSON może obsłużyć implementacja JavaScript w różnych przeglądarkach (np. Około 40 MB z mojego doświadczenia). Zobacz na przykład to pytanie .

cdiggins
źródło
4
8K to wyjątkowo mały limit dla formatu JSON. Podejrzewam, że to nie jest ograniczenie dla JSON, ale raczej dane są przesyłane w blokach 8K, a kod odbierający dane próbuje deserializować pojedynczy blok, zamiast czekać na przybycie całego ładunku.
Hot Licks
Założę się, że masz rację Hot Licks. Zaktualizowałem odpowiedź.
cdiggins,
9

To zależy od implementacji twojego modułu zapisującego / parsera JSON. Wydaje się, że Microsoft DataContractJsonSerializer ma sztywny limit około 8kb (myślę, że 8192) i będzie wyświetlał błąd w przypadku większych ciągów.

Edycja: udało nam się rozwiązać limit 8K dla ciągów JSON, ustawiając właściwość MaxJsonLength w konfiguracji sieci Web zgodnie z opisem w tej odpowiedzi: https://stackoverflow.com/a/1151993/61569

Anthony F.
źródło
5
„Limit” 8K jest prawie na pewno granicą bloku transmisji danych, a nie limitem dla dokumentu JSON. Większe ciągi mogą być przetwarzane przez prawidłowe ponowne złożenie transmisji wieloblokowej.
Hot Licks,
Minęło trochę czasu, odkąd wymyśliliśmy, jak zmienić limit 8K w DataContractJsonSerializer, ale myślę, że było to ustawienie „MaxJsonLength” ( msdn.microsoft.com/en-us/library/ ... )
Anthony F,
5

Naprawdę nie ma ograniczeń co do wielkości wysyłanych lub odbieranych danych JSON. Możemy również wysłać dane Json w pliku. W zależności od możliwości przeglądarki, z którą pracujesz, dane Json mogą być obsługiwane.

Chaitanya Belsare
źródło
5

Implementacje mogą swobodnie ustalać limity dla dokumentów JSON, w tym rozmiar, więc mądrze wybierz parser. Zobacz RFC 7159 , Rozdział 9. Parsery:

"Implementacja może określać limity rozmiaru tekstów, które akceptuje. Implementacja może określać limity maksymalnej głębokości zagnieżdżania. Implementacja może określać ograniczenia dotyczące zakresu i precyzji liczb. Implementacja może określać ograniczenia dotyczące długości i charakteru zawartość ciągów. "

stleary
źródło
3

Jeśli pracujesz z ASP.NET MVC, możesz rozwiązać problem, dodając MaxJsonLength do wyniku:

var jsonResult = Json(new
{
    draw = param.Draw,
    recordsTotal = count,
    recordsFiltered = count,
    data = result
}, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = int.MaxValue;
mathias.horn
źródło
Ale to sprawia, że ​​maksymalna wielkość wynosi około 4 MB i potrzebujemy jej więcej. Jak mogliśmy sobie poradzić z takim scenariuszem?
Casey
@Casey - jaki objaw występuje u Ciebie powyżej 4MB? 32-bitowa liczba całkowita ze znakiem wzrasta do 2 miliardów - gdzieś musi być coś, co ogranicza Twój rozmiar. Domyślna wartość MaxJsonLength jest znaków 2M Unicode, więc 4MB. Powyższy kod zwiększa MaxJsonLength do znacznie większej wartości. Może int.MaxValuejest odrzucany jako „za duży” - wypróbuj inne rozmiary i zobacz, jak duży możesz uzyskać.
ToolmakerSteve
Wiesz co, masz rację. Prawdopodobnie pojawia się komunikat o błędzie flase lub nie wykorzystuje ustawienia. Próbuję zrobić ten kontroler wstępny, a nie wynik. Kiedy próbuję wysłać duży obiekt Json do wywołania kontrolera, jeśli używam narzędzi programistycznych i debuguję po stronie serwera żądań, zwraca rozmiar przekraczający limit Json.
Casey
To jest mój problem, jak obejść to w witrynie sieci Web firmy Microsoft. „Zasadniczo„ wewnętrzny ”JavaScriptSerializer szanuje wartość maxJsonLength, gdy jest wywoływany z metody internetowej. Bezpośrednie użycie JavaScriptSerializer (lub użycie za pośrednictwem metody akcji / kontrolera MVC) nie uwzględnia właściwości maxJsonLength, przynajmniej nie z systemuWebExtensions .scripting.webServices.jsonSerialization, którą definiujesz w pliku web.config. "
Casey
Prawie zastanawiam się, czy mógłbym powiedzieć, podziel cokolwiek ponad 50k na kawałki, takie jak List <type string>, a następnie wyślij to do kontrolera i wykonaj bulder ciągów, a następnie zaimportuj do SQL.
Casey
2

Z pewnością wszyscy przegapili tutaj sztuczkę. Obecny limit rozmiaru pliku json wynosi 18 446 744 073 709 551 616 znaków lub, jeśli wolisz bajty, lub nawet 2 ^ 64 bajty, jeśli patrzysz na przynajmniej 64-bitowe infrastruktury.

Pod każdym względem możemy założyć, że jest nieograniczony, ponieważ prawdopodobnie będziesz miał trudności z trafieniem w ten problem ...

Perfect64
źródło
-6

Maksymalna długość ciągów JSON. Wartość domyślna to 2097152 znaków, co odpowiada 4 MB danych ciągu Unicode.

Zobacz poniższy adres URL

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

Shashi Keshar
źródło
2
Sam JSON nie ma żadnych ograniczeń. Opublikowane informacje dotyczą domeny .net i jej JavaScriptSerializerklasy. I MaxJsonLengthzostało już omówione w innych odpowiedziach.
David Makogon
Czy ktoś może opublikować, jak obsłużyć większy niż .NET JavaScriptSerializer? Na przykład, jak mogę wysłać duży json do kontrolera MVC, ale użyć serializatora Newtonsoft do jego obsługi, czy nie jest to możliwe, ponieważ jest on wbudowany w .NET i używany przed trafieniem kontrolera?
Casey