Có giới hạn về số lượng JSON có thể giữ không?


163

Tôi đang sử dụng jquery, JSON và AJAX cho một hệ thống bình luận. Tôi tò mò, có giới hạn kích thước đối với những gì bạn có thể gửi qua / lưu trữ với JSON không? Giống như nếu người dùng nhập một số lượng lớn và tôi gửi nó qua JSON thì có giới hạn tối đa nào không?

Cũng có thể gửi bất kỳ loại văn bản nào thông qua JSON. ví dụ, đôi khi tôi cho phép người dùng sử dụng html, điều này có ổn không?


9
Hãy cẩn thận cách bạn diễn giải câu trả lời của mọi người dưới đây! Hầu hết các câu trả lời đều nói rằng không có giới hạn nào cho bản thân 'JSON'. Trong khi hầu hết các máy chủ sẽ có giới hạn cấu hình. Tôi đã chạy thử nghiệm AJAX đơn giản trong đó tôi đã tăng một byte trên mỗi lần gửi và ở mức xấp xỉ 8K byte, nó đã thất bại trên một số máy chủ PHP / Apache mà tôi đã thử bây giờ. Lỗi là: "414 (URI yêu cầu quá lớn)"
Jeach

3
Chúng tôi đáng tin cậy gửi / nhận tải trọng 100kb trên iOS / iPhone. Một điều cần lưu ý là nhiều giao thức nhận dữ liệu theo từng khối và cố gắng giải tuần tự hóa khối thay vì chờ tất cả dữ liệu nhận được sẽ dẫn đến thất bại, trừ khi logic trình giải nén của bạn được thiết lập đặc biệt cho nó.
Hot Licks

1
@Jeach - Thất bại đó gần như chắc chắn là do việc truyền dữ liệu bị chia thành các khối 8K, sau đó không được lắp lại đúng cách ở đầu bên kia trước khi thử phân tích cú pháp.
Licks nóng

1
@Jeach - Đây là một lỗi mã hóa phổ biến. Chỉ chờ tin nhắn phản hồi đầu tiên từ một yêu cầu so với chờ tin nhắn cuối cùng và nối dữ liệu phản hồi lại với nhau. Mỗi phản hồi sẽ chứa tối đa 8K, do đó, đối với dữ liệu dài hơn, nhiều phản hồi sẽ được sử dụng.
Licks nóng

1
@Jeach - Nếu bạn đang thực hiện việc này trong iOS, với NSURLConnectionh tiêu chuẩn, bạn cần triển khai connectionDidFinishLoadingvà thực hiện bản dịch JSON ở đó (hoặc sau đó được gọi), chứ không phải didReceiveData(nơi bạn chỉ cần ghép dữ liệu nhận được với ngày trước đó nhận). Các môi trường khác cũng tương tự.
Licks nóng

Câu trả lời:


141

JSON tương tự như các định dạng dữ liệu khác như XML - nếu bạn cần truyền thêm dữ liệu, bạn chỉ cần gửi thêm dữ liệu. Không có giới hạn kích thước vốn có cho yêu cầu JSON. Bất kỳ giới hạn nào sẽ được đặt bởi máy chủ phân tích yêu cầu. (Ví dụ: ASP.NET có thuộc tính "MaxJsonLpm" của bộ nối tiếp.)


1
thật kỹ thuật, nếu tôi muốn đưa mã nguồn WHOLE vào toàn bộ trang này, nó có thể được gửi dưới dạng đối tượng json không?
JasonDavis

Mã của trang này thực sự chỉ có 6,7kb (không tính các tài nguyên bên ngoài). Điều đó dễ dàng được thực hiện với bất kỳ loại yêu cầu HTTP nào.
Amber

15
Có thể đáng chú ý rằng "mặc định là 2097152 ký tự, tương đương với 4 MB dữ liệu chuỗi Unicode" cho thuộc tính JavaScriptSerializer.MaxJsonLengthđược đề cập trong câu trả lời của Amber. (NB tôi đã trích dẫn từ MSDN )
dumbledad

Vậy làm thế nào tôi có thể phân tích cú pháp đối tượng JSON 155kb?
Ray

2
@AsadHasan Một máy chủ có thể phân tích cú pháp hoặc tuần tự hóa, tùy thuộc vào hướng dữ liệu đang đi.
Amber

18

Không có giới hạn cố định về mức độ lớn của khối dữ liệu JSON hoặc bất kỳ trường nào.

Có nhiều giới hạn đối với việc triển khai JavaScript của nhiều trình duyệt khác nhau (ví dụ như khoảng 40 MB theo kinh nghiệm của tôi). Xem câu hỏi này chẳng hạn .


4
8K là một giới hạn cực kỳ nhỏ đối với JSON. Tôi nghi ngờ đó không phải là giới hạn cho JSON, mà là dữ liệu đang được truyền trong các khối 8K và mã nhận dữ liệu đang cố gắng giải tuần tự hóa một khối riêng lẻ thay vì chờ toàn bộ tải trọng đến.
Hot Licks

Tôi cá là bạn đúng Licks. Tôi cập nhật câu trả lời của tôi.
cdiggins

9

Nó phụ thuộc vào việc triển khai trình soạn thảo / trình phân tích cú pháp JSON của bạn. DataContractJsonSerializer của Microsoft dường như có giới hạn cứng khoảng 8kb (tôi nghĩ là 8192) và nó sẽ báo lỗi cho các chuỗi lớn hơn.

Chỉnh sửa: Chúng tôi có thể giải quyết giới hạn 8K cho chuỗi JSON bằng cách đặt thuộc tính MaxJsonLpm trong cấu hình web như được mô tả trong câu trả lời này: https://stackoverflow.com/a/1151993/61569


5
"Giới hạn" 8K gần như chắc chắn là ranh giới khối truyền dữ liệu, không phải là giới hạn cho tài liệu JSON. Các chuỗi lớn hơn có thể được xử lý bằng cách ghép lại chính xác việc truyền nhiều khối.
Licks nóng

Đã được một thời gian kể từ khi chúng tôi tìm ra cách thay đổi giới hạn 8K trong DataContractJsonSerializer, nhưng tôi nghĩ đó là cài đặt "MaxJsonLpm" ( msdn.microsoft.com/en-us/l Library / thép )
Anthony F

5

Thực sự không có giới hạn về kích thước của dữ liệu JSON được gửi hoặc nhận. Chúng tôi cũng có thể gửi dữ liệu Json trong tập tin. Theo khả năng của trình duyệt mà bạn đang làm việc, dữ liệu Json có thể được xử lý.


5

Việc triển khai có thể tự do đặt giới hạn cho các tài liệu JSON, bao gồm kích thước, vì vậy hãy chọn trình phân tích cú pháp của bạn một cách khôn ngoan. Xem RFC 7159 , Phần 9. Trình phân tích cú pháp:

"Việc triển khai có thể đặt giới hạn về kích thước của văn bản mà nó chấp nhận. Việc triển khai có thể đặt giới hạn về độ sâu lồng tối đa. Việc triển khai có thể đặt giới hạn về phạm vi và độ chính xác của số. Việc triển khai có thể đặt giới hạn về độ dài và ký tự nội dung của chuỗi. "


3

Nếu bạn đang làm việc với ASP.NET MVC, bạn có thể giải quyết vấn đề bằng cách thêm MaxJsonLpm vào kết quả của bạn:

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

Nhưng điều này làm cho tối đa khoảng 4 MB và chúng tôi cần nó cao hơn. Làm thế nào chúng ta có thể xử lý kịch bản đó?
Casey

@Casey - Triệu chứng nào xảy ra với bạn ngoài 4MB? số nguyên 32 bit đã ký lên tới 2 tỷ - phải có thứ gì đó giới hạn kích thước của bạn. Các mặc định giá trị của MaxJsonLength là chars 2M Unicode, vì vậy 4MB. Đoạn mã trên đang tăng MaxJsonLpm lên giá trị lớn hơn nhiều . Có thể int.MaxValuebị từ chối là "quá lớn" - hãy thử các kích thước khác và xem bạn có thể nhận được kích thước lớn như thế nào.
ToolmakerSteve

Bạn biết những gì, bạn là chính xác. Tôi có thể nhận được một bong bóng lỗi flase, hoặc nó không sử dụng cài đặt. Tôi đang cố gắng để làm điều khiển trước này, không phải trên kết quả. Khi tôi cố gắng gửi một đối tượng Json lớn đến cuộc gọi của bộ điều khiển, nếu tôi sử dụng các công cụ dành cho nhà phát triển và gỡ lỗi thì phía máy chủ yêu cầu sẽ trả lại kích thước vượt quá giới hạn Json.
Casey

Đây là vấn đề của tôi, làm thế nào để khắc phục điều này trên mỗi trang web của Microsoft. "Về cơ bản, JavaScriptSerializer" nội bộ "tôn trọng giá trị của maxJsonLpm khi được gọi từ một phương thức web. Việc sử dụng trực tiếp JavaScriptSerializer (hoặc sử dụng thông qua một phương thức / bộ điều khiển hành động MVC) không tôn trọng thuộc tính maxJsonLpm, ít nhất là không phải từ systemWebExtensions .scripting.webService.jsonSerialization mà bạn xác định trong tệp web.config. "
Casey

Tôi gần như tự hỏi liệu tôi có thể nói, chia bất cứ thứ gì trên 50k thành các khối như Danh sách <kiểu chuỗi>, sau đó gửi nó đến bộ điều khiển và thực hiện một trình tạo chuỗi, sau đó nhập vào SQL.
Casey

2

Chắc chắn mọi người đã bỏ lỡ một mẹo ở đây. Giới hạn kích thước tệp hiện tại của tệp json là 18,446,744,073,709,551,616 ký tự hoặc nếu bạn thích byte, hoặc thậm chí 2 ^ 64 byte nếu bạn đang xem ít nhất là cơ sở hạ tầng 64 bit.

Đối với tất cả ý định và mục đích, chúng tôi có thể cho rằng nó không giới hạn vì có lẽ bạn sẽ gặp khó khăn trong vấn đề này ...


-6

Độ dài tối đa của chuỗi JSON. Mặc định là 2097152 ký tự, tương đương với 4 MB dữ liệu chuỗi Unicode.

Tham khảo URL bên dưới

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


2
Bản thân JSON không có giới hạn vốn có. Những gì bạn đã đăng là cụ thể cho .net và JavaScriptSerializerlớp của nó . Và MaxJsonLengthđã được giải quyết trong các câu trả lời khác.
David Makogon

Bất cứ ai cũng có thể đăng làm thế nào để xử lý lớn hơn .NET JavaScriptSerializer? Ví dụ: làm thế nào tôi có thể gửi một json lớn đến bộ điều khiển MVC nhưng sử dụng serializer của Newtonsoft để xử lý nó hoặc điều này là không thể vì nó được tích hợp vào .NET và sử dụng bộ điều khiển trước bị tấn công?
Casey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.