JSON'un ne kadar tutabileceğine dair bir sınır var mı?


163

Bir yorum sistemi için jquery, JSON ve AJAX kullanıyorum. Merak ediyorum, JSON ile gönderebileceğin / saklayabileceğin bir boyut sınırı var mı? Bir kullanıcı büyük miktarda yazıyor ve ben JSON üzerinden göndermek gibi bir tür maksimum sınır var mı?

Ayrıca her türlü metin JSON aracılığıyla gönderilebilir. Örneğin, kullanıcıların html kullanmasına izin verdiğimde, bu iyi olacak mı?


9
İnsanların yanıtlarını aşağıda nasıl yorumladığınıza dikkat edin! Çoğu cevap 'JSON'un kendisi için sınır olmadığını söylüyor. Çoğu sunucunun yapılandırılabilir bir sınırı olacaktır. Ben her gönderme bir bayt arttı basit bir AJAX testi koştu ve yaklaşık 8 K bayt, şimdi denedim birkaç PHP / Apache sunucularında başarısız oldu. Hata: "414 (İstek-URI Çok Büyük)"
Jeach

3
İOS / iPhone'da güvenilir bir şekilde 100 kb yükler gönderiyoruz / alıyoruz. Dikkat edilmesi gereken bir şey, birçok protokolün parçalar halinde veri alması ve serileştirici mantığınız özel olarak ayarlanmadığı sürece, tüm verilerin alınmasını beklemek yerine yığının serileştirilmesini denemenin başarısızlığa neden olacağıdır.
Hot Licks

1
@Jeach - Bu başarısızlık neredeyse kesinlikle veri iletiminin 8K bloklara bölünmesinden kaynaklanıyordu, daha sonra ayrıştırmaya çalışmadan önce diğer uçta düzgün bir şekilde yeniden birleştirilmiyordu.
Hot Licks

1
@Jeach - Bu yaygın bir kodlama hatasıdır. Sadece bir istekten gelen ilk yanıt mesajını beklemek, sonuncuyu beklemek ve yanıt verilerini birleştirmek. Her yanıt en fazla 8K içerecektir, bu nedenle daha uzun veriler için birden çok yanıt kullanılır.
Hot Licks

1
@Jeach - Bunu iOS'ta standart bir NSURLConnectionh connectionDidFinishLoadingile yapıyorsanız, JSON çevirisini burada (veya bundan sonra çağırılır) uygulamanız ve didReceiveDatayapmanız gerekir (burada alınan verileri daha önce tarihle birleştirmeniz gerekir) Alınan). Diğer ortamlar benzer.
Hot Licks

Yanıtlar:


141

JSON, XML gibi diğer veri biçimlerine benzer - daha fazla veri iletmeniz gerekiyorsa, yalnızca daha fazla veri gönderirsiniz. JSON isteğinde doğal bir boyut sınırlaması yoktur. Herhangi bir sınırlama, istek ayrıştırılan sunucu tarafından ayarlanır. (Örneğin, ASP.NET, serileştiricinin "MaxJsonLength" özelliğine sahiptir.)


1
Bu yüzden teknik olarak, BÜTÜN kaynak kodunu bu sayfaya götürmek istersem, json nesnesi olarak gönderilebilir mi?
JasonDavis

Bu sayfanın kodu aslında sadece 6,7 kb'dir (harici kaynakları saymaz). Bu hemen hemen her tür HTTP isteğiyle kolayca yapılabilir.
Amber

15
JavaScriptSerializer.MaxJsonLengthAmber yanıtında belirtilen özellik için "varsayılan değer 2097152 karakterdir, bu da 4 MB Unicode dize verisine eşdeğerdir" . (Not: MSDN'den alıntı yaptım )
dumbledad

Peki 155kb JSON nesnesini nasıl ayrıştırırım?
Ray

2
@AsadHasan Bir sunucu, verilerin hangi yöne gittiğine bağlı olarak ayrıştırabilir veya serileştirebilir.
Amber

18

Bir JSON veri bloğunun veya alanların herhangi birinin büyüklüğü konusunda sabit bir sınır yoktur.

Çeşitli tarayıcıların JavaScript uygulamasının ne kadar JSON işleyebileceğine ilişkin sınırlamalar vardır (örneğin, deneyimime göre yaklaşık 40 MB). Örneğin bu soruya bakın .


4
8K, JSON için son derece küçük bir sınırdır. Bu JSON için bir sınır değil, daha ziyade veri 8K bloklar halinde iletiliyor ve veri alan kod tüm yükü gelmesini beklemek yerine tek bir bloğu serileştirmek için çalışıyor sanıyorum.
Hot Licks

Eminim haklısın Hot Licks. Cevabımı güncelledim.
cdiggins

9

JSON yazarınızın / ayrıştırıcısının uygulanmasına bağlıdır. Microsoft'un DataContractJsonSerializer'ı 8kb (8192 bence) civarında sabit bir sınıra sahip gibi görünüyor ve daha büyük dizeler için hata verecek.

Düzenleme: Web yapılandırmasında MaxJsonLength özelliğini şu cevapta açıklandığı gibi ayarlayarak JSON dizeleri için 8K sınırını çözmeyi başardık: https://stackoverflow.com/a/1151993/61569


5
8K "sınır", bir JSON belgesi için sınır değil, neredeyse kesinlikle bir veri iletim bloğu sınırıdır. Daha büyük teller, çok bloklu iletimin doğru şekilde yeniden monte edilmesiyle işlenebilir.
Hot Licks

DataContractJsonSerializer'da 8K sınırını nasıl değiştireceğimizi anladığımızdan beri bir süre geçti, ancak "MaxJsonLength" ayarı olduğunu düşünüyorum ( msdn.microsoft.com/en-us/library/… )
Anthony F

5

Gönderilecek veya alınacak JSON verilerinin boyutunda gerçekten bir sınır yoktur. Json verilerini dosyaya da gönderebiliriz. Üzerinde çalıştığınız tarayıcının yeteneklerine göre, Json verileri işlenebilir.


5

Uygulamalar, boyut dahil JSON belgelerinde sınırlar belirlemekte serbesttir, bu nedenle ayrıştırıcıyı akıllıca seçin. Bkz. RFC 7159 , Bölüm 9. Ayrıştırıcılar:

"Bir uygulama, kabul ettiği metinlerin boyutuna sınır koyabilir. Bir uygulama, maksimum iç içe yerleştirme derinliğine sınırlar koyabilir. Bir uygulama, sayıların aralığı ve hassasiyeti için sınırlar koyabilir. Bir uygulama, uzunluk ve karakter için sınırlar koyabilir dizelerin içeriği. "


3

ASP.NET MVC ile çalışıyorsanız , sonucunuza MaxJsonLength ekleyerek sorunu çözebilirsiniz :

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

Ancak bu, maksimum kabaca 4 MB yapar ve daha yüksek bir değere ihtiyacımız vardır. Bu senaryoyu nasıl ele alabiliriz?
Casey

@Casey - 4MB'nin ötesinde sizin için ne belirti olur? imzalı 32 bit tam sayı 2 milyar'a kadar çıkıyor - başka bir yerde boyutunuzu sınırlayan bir şey olmalı. Varsayılan MaxJsonLength değeri 4 MB böylece, 2M Unicode karakter olduğunu. Yukarıdaki kod olan artan a MaxJsonLength çok daha büyük bir değer. Belki int.MaxValue"çok büyük" olarak reddedilir - diğer boyutları deneyin ve ne kadar büyük olabileceğinizi görün.
ToolmakerSteve

Biliyor musun, haklısın. Muhtemelen bir hata hata balonu yukarı ma ya da ayarı kullanmıyor. Sonuçta değil, bu ön kontrolörü yapmaya çalışıyorum. Denetleyici çağrısına büyük bir Json nesnesi göndermeye çalıştığımda, geliştirici araçlarını kullanır ve hata ayıklama isteği sunucu tarafı boyutu döndürüyor Json sınırını aşıyor.
Casey

Bu benim sorunum, Microsoft'un web sitesi başına bu nasıl giderilir. "Temel olarak," dahili "JavaScriptSerializer, bir web yönteminden çağrıldığında maxJsonLength değerine saygı duyar. Bir JavaScriptSerializer'ın doğrudan kullanımı (veya bir MVC eylem yöntemi / Denetleyici aracılığıyla kullanım), en azından systemWebExtensions öğesinden değil, maxJsonLength özelliğine saygı göstermez. web.config dosyasında tanımladığınız .scripting.webServices.jsonSerialization bölümü. "
Casey

Neredeyse merak edebilir miyim, List <type string> gibi parçalar halinde 50k üzerinde bir şey kırın, sonra denetleyiciye gönderin ve bir dize bulder yapın, sonra SQL içine alın.
Casey

2

Elbette herkes burada bir numara kaçırdı. Bir json dosyasının geçerli dosya boyutu sınırı 18.446.744.073.709.551.616 karakterdir veya baytları, hatta en az 64 bit altyapılara bakıyorsanız 2 ^ 64 bayttır.

Tüm niyetler ve amaçlar için, sınırsız olduğunu varsayabiliriz, çünkü muhtemelen bu sorunu vurmakta zorlanacaksınız ...


-6

JSON dizelerinin maksimum uzunluğu. Varsayılan değer, 4 MB Unicode dize verisine eşdeğer olan 2097152 karakterdir.

Aşağıdaki URL'ye bakın

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


2
JSON'un kendisinde doğal bir sınır yoktur. Gönderdikleriniz .net ve JavaScriptSerializersınıfına özgüdür . Ve MaxJsonLengthdiğer cevaplarda zaten ele alındı.
David Makogon

Herkes nasıl .NET JavaScriptSerializer daha büyük işlemek için gönderebilir? Örneğin, MVC denetleyicisine nasıl büyük bir json gönderebilirim, ancak Newtonsoft'un serileştiricisini kullanmak için kullanabilir miyim?
Casey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.