มีข้อ จำกัด เกี่ยวกับจำนวน JSON ที่สามารถถือครองได้หรือไม่?


163

ฉันใช้ jquery, JSON และ AJAX สำหรับระบบความคิดเห็น ฉันอยากรู้อยากเห็นมีการ จำกัด ขนาดสำหรับสิ่งที่คุณสามารถส่งผ่าน / ร้านค้าด้วย JSON หรือไม่ เช่นถ้าผู้ใช้พิมพ์จำนวนมากและฉันส่งผ่าน JSON มีขีด จำกัด สูงสุดไหม

ข้อความชนิดใดก็ได้ที่สามารถส่งผ่าน JSON เช่นบางครั้งฉันอนุญาตให้ผู้ใช้ใช้ html นี่จะโอเคไหม


9
ระวังวิธีตีความคำตอบของผู้คนด้านล่าง! คำตอบส่วนใหญ่บอกว่าไม่มีการ จำกัด 'JSON' เอง ในขณะที่เซิร์ฟเวอร์ส่วนใหญ่จะมีการกำหนดขีด จำกัด ฉันรันการทดสอบ AJAX ง่าย ๆ ที่ฉันเพิ่มจำนวนไบต์ในการส่งแต่ละครั้งและประมาณ 8K ไบต์มันล้มเหลวในเซิร์ฟเวอร์ PHP / Apache หลายเครื่องที่ฉันลองตอนนี้ ข้อผิดพลาดคือ: "414 (Request-URI Too Large)"
Jeach

3
เราส่ง / รับ payloads ได้ 100kb บน iOS / iPhone อย่างน่าเชื่อถือ สิ่งที่ต้องระวังคือโปรโตคอลจำนวนมากได้รับข้อมูลเป็นชิ้น ๆ และพยายามที่จะแยกแยะก้อนข้อมูลแทนที่จะรอข้อมูลทั้งหมดที่จะได้รับจะส่งผลให้เกิดความล้มเหลวเว้นแต่ว่าจะมีการตั้งค่าตรรกะของ deserializer เป็นพิเศษ
Hot Licks

1
@Jeach - ความล้มเหลวนั้นเกือบแน่นอนเนื่องจากการส่งข้อมูลถูกแบ่งออกเป็น 8K บล็อกจากนั้นไม่ประกอบขึ้นอีกครั้งอย่างถูกต้องที่ปลายอีกด้านก่อนที่จะพยายามแยกวิเคราะห์
Hot Licks

1
@Jeach - นี่เป็นข้อผิดพลาดในการเขียนโปรแกรมทั่วไป รอเฉพาะข้อความตอบกลับแรกจากคำร้องขอและรอข้อมูลล่าสุดและต่อข้อมูลการตอบกลับเข้าด้วยกัน การตอบสนองแต่ละครั้งจะมีไม่เกิน 8K ดังนั้นสำหรับการใช้ข้อมูลที่นานขึ้นจะมีการตอบกลับหลายครั้ง
Hot Licks

1
@Jeach - หากคุณทำสิ่งนี้ใน iOS ด้วย NSURLConnectionh มาตรฐานคุณต้องใช้connectionDidFinishLoadingและทำการแปล JSON ที่นั่น (หรือหลังจากนั้นเรียกว่า) ไม่ใช่ในdidReceiveData(ที่คุณควรเชื่อมข้อมูลที่ได้รับพร้อมวันที่ก่อนหน้านี้ ที่ได้รับ) สภาพแวดล้อมอื่นนั้นคล้ายคลึงกัน
Hot Licks

คำตอบ:


141

JSON คล้ายกับรูปแบบข้อมูลอื่นเช่น XML - หากคุณต้องการส่งข้อมูลเพิ่มเติมคุณเพียงแค่ส่งข้อมูลมากขึ้น ไม่มีข้อ จำกัด ด้านขนาดของคำขอ JSON ข้อ จำกัด ใด ๆ ที่จะถูกกำหนดโดยเซิร์ฟเวอร์แยกวิเคราะห์คำขอ (ตัวอย่างเช่น ASP.NET มีคุณสมบัติ "MaxJsonLength" ของ serializer)


1
ดังนั้นในทางเทคนิคหากฉันต้องการนำซอร์สโค้ด WHOLE ไปยังหน้านี้ทั้งหมดอาจส่งเป็นวัตถุ json ได้หรือไม่
JasonDavis

รหัสของหน้านี้เป็นเพียง 6.7kb (ไม่นับทรัพยากรภายนอก) สามารถทำได้อย่างง่ายดายด้วยคำขอ HTTP ประเภทใดก็ได้
เหลืองอำพัน

15
อาจเป็นที่น่าสังเกตว่า "ค่าเริ่มต้นคือ 2097152 อักขระซึ่งเทียบเท่ากับข้อมูลสตริง Unicode 4 MB" สำหรับคุณสมบัติที่JavaScriptSerializer.MaxJsonLengthกล่าวถึงในคำตอบของ Amber (NB ฉันได้อ้างอิงจากMSDN )
dumbledad

ดังนั้นฉันจะแยกวิเคราะห์วัตถุ JSON ขนาด 155kb ได้อย่างไร
เรย์

2
@ AsadHasan เซิร์ฟเวอร์สามารถแยกวิเคราะห์หรือทำให้เป็นอนุกรมขึ้นอยู่กับทิศทางของข้อมูล
แอมเบอร์

18

ไม่มีการ จำกัด แน่นอนเกี่ยวกับขนาดบล็อกข้อมูล JSON หรือฟิลด์ใด ๆ

มีข้อ จำกัด ว่าจาวาสคริปต์เบราว์เซอร์ต่างๆสามารถรองรับ JavaScript ได้เท่าใด (เช่นประมาณ 40MB ในประสบการณ์ของฉัน) ดูคำถามนี้เช่น


4
8K เป็นข้อ จำกัด เล็กน้อยสำหรับ JSON ฉันสงสัยว่าไม่ใช่ขีด จำกัด ของ JSON แต่เป็นการส่งข้อมูลในบล็อก 8K และรหัสที่ได้รับข้อมูลกำลังพยายามทำให้ deserialize บล็อกแต่ละบล็อกแทนที่จะรอให้ payload ทั้งหมดมาถึง
Hot Licks

ฉันพนันได้เลยว่าคุณเป็น Hot Licks ที่ถูกต้อง ฉันปรับปรุงคำตอบของฉัน
cdiggins

9

ขึ้นอยู่กับการใช้งานตัวเขียน / ตัวแยกวิเคราะห์ JSON ของคุณ DataContractJsonSerializer ของ Microsoft ดูเหมือนว่าจะมีข้อ จำกัด อย่างหนักประมาณ 8kb (ฉันคิดว่า 8192) และจะเกิดข้อผิดพลาดสำหรับสตริงที่มีขนาดใหญ่ขึ้น

แก้ไข: เราสามารถแก้ไขข้อ จำกัด 8K สำหรับสตริง JSON โดยการตั้งค่าคุณสมบัติ MaxJsonLength ในการกำหนดค่าเว็บตามที่อธิบายไว้ในคำตอบนี้: https://stackoverflow.com/a/1151993/61569


5
"ขีด จำกัด " 8K นั้นเกือบจะเป็นขอบเขตของการส่งข้อมูลไม่ใช่ขีด จำกัด ของเอกสาร JSON สตริงที่มีขนาดใหญ่ขึ้นสามารถประมวลผลได้อย่างถูกต้องโดยประกอบชิ้นส่วนการส่งหลายบล็อกใหม่อย่างถูกต้อง
Hot Licks

เป็นเวลานานแล้วที่เราพบวิธีเปลี่ยนขีด จำกัด 8K ใน DataContractJsonSerializer แต่ฉันคิดว่ามันเป็นการตั้งค่า "MaxJsonLength" ( msdn.microsoft.com/en-us/library/… )
Anthony F

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;

แต่นี่ทำให้สูงสุดประมาณ 4MB และเราต้องการมันสูงกว่า เราจะรับมือกับสถานการณ์นั้นได้อย่างไร?
Casey

@Casey - คุณมีอาการอะไรเกินกว่า 4MB? จำนวนเต็มแบบ 32 บิตที่เซ็นชื่อแล้วมีมากถึง 2 พันล้าน - ต้องมีบางอย่างที่ จำกัด ขนาดของคุณ เริ่มต้นค่าของ MaxJsonLength เป็นตัวอักษร 2M Unicode ดังนั้น 4MB รหัสข้างต้นจะเพิ่มขึ้น MaxJsonLength ไปมีขนาดใหญ่มากค่า อาจint.MaxValueถูกปฏิเสธว่า "ใหญ่เกินไป" - ลองขนาดอื่น ๆ และดูว่าคุณจะได้รับขนาดใหญ่เพียงใด
ToolmakerSteve

คุณรู้อะไรถูกต้อง ฉันอาจจะเกิดข้อผิดพลาด flase ขึ้นหรือไม่ใช้การตั้งค่า ฉันพยายามที่จะทำควบคุมนี้ก่อนไม่ได้อยู่ในผล เมื่อฉันพยายามส่งวัตถุ Json ที่มีขนาดใหญ่ไปยังตัวควบคุมการโทรถ้าฉันใช้เครื่องมือนักพัฒนาและดีบักฝั่งเซิร์ฟเวอร์คำขอจะส่งคืนขนาดเกินขีด จำกัด Json
Casey

นี่คือปัญหาของฉันวิธีการหลีกเลี่ยงปัญหานี้ต่อเว็บไซต์ของ Microsoft "พื้นฐาน" JavaScriptSerializer "ภายใน" เคารพค่าของ maxJsonLength เมื่อถูกเรียกจากวิธีการทางเว็บการใช้ JavaScriptSerializer โดยตรง (หรือใช้ผ่าน MVC action-method / Controller) ไม่เคารพคุณสมบัติ maxJsonLength อย่างน้อยที่สุดก็ไม่ได้มาจาก systemWebExtensions .scripting.webServices.jsonSerialization ส่วนที่คุณกำหนดในไฟล์ web.config "
Casey

ฉันเกือบจะสงสัยว่าฉันสามารถพูดอะไรแบ่งมากกว่า 50k เป็นชิ้น ๆ เช่น List <type string> จากนั้นส่งไปยังตัวควบคุมและทำ bulder สตริงแล้วนำเข้า SQL
Casey

2

แน่นอนว่าทุกคนพลาดเคล็ดลับที่นี่ ขีด จำกัด ขนาดไฟล์ปัจจุบันของไฟล์ json คือ 18,446,744,073,709,551,616 ตัวอักษรหรือหากคุณต้องการจำนวนไบต์หรือแม้กระทั่ง 2 ^ 64 ไบต์หากคุณดูโครงสร้างพื้นฐาน 64 บิตเป็นอย่างน้อย

สำหรับจุดประสงค์ทั้งหมดและวัตถุประสงค์เราสามารถสันนิษฐานได้ว่าไม่ จำกัด เนื่องจากคุณอาจมีปัญหาในการตีปัญหานี้ ...


-6

ความยาวสูงสุดของสตริง JSON ค่าเริ่มต้นคือ 2097152 อักขระซึ่งเทียบเท่ากับข้อมูลสตริง Unicode 4 MB

อ้างอิง 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ได้รับการตอบแล้วในคำตอบอื่น ๆ
David Makogon

ทุกคนสามารถโพสต์วิธีการจัดการที่ใหญ่กว่านั้นด้วย. NET JavaScriptSerializer? ตัวอย่างเช่นฉันจะส่ง json ขนาดใหญ่ไปยังตัวควบคุม MVC ได้อย่างไร แต่ใช้ serializer ของ Newtonsoft เพื่อจัดการมันหรือเป็นไปไม่ได้เนื่องจากมันถูกสร้างขึ้นใน. NET และใช้คอนโทรลเลอร์ล่วงหน้าที่กำลังถูกตี
Casey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.