Apakah ada batasan berapa banyak JSON dapat menampung?

163

Saya menggunakan jquery, JSON, dan AJAX untuk sistem komentar. Saya ingin tahu, apakah ada batasan ukuran pada apa yang dapat Anda kirim / simpan dengan JSON? Seperti jika pengguna mengetikkan jumlah besar dan saya mengirimnya melalui JSON apakah ada semacam batas maksimum?

Bisa juga semua jenis teks dikirim melalui JSON. misalnya terkadang saya mengizinkan pengguna untuk menggunakan html, apakah ini boleh?

JasonDavis
sumber
9
Hati-hati bagaimana Anda menafsirkan jawaban orang-orang di bawah ini! Sebagian besar jawaban mengatakan tidak ada batasan untuk 'JSON' itu sendiri. Sementara sebagian besar server akan memiliki batas yang dapat dikonfigurasi. Saya menjalankan tes AJAX sederhana di mana saya menambah byte pada setiap pengiriman dan sekitar 8K byte, gagal pada beberapa server PHP / Apache yang saya coba sekarang. Kesalahan adalah: "414 (Permintaan-URI Terlalu Besar)"
Jeach
3
Kami andal mengirim / menerima muatan 100 kb di iOS / iPhone. Yang perlu diwaspadai adalah bahwa banyak protokol menerima data dalam bentuk chunk, dan berusaha untuk menghapus tanda chunk daripada menunggu semua data yang diterima akan mengakibatkan kegagalan, kecuali logika deserializer Anda secara khusus diatur untuk itu.
Hot Licks
1
@ Jeach - Kegagalan itu hampir pasti karena transmisi data dipecah menjadi blok 8K, kemudian tidak dipasang kembali dengan benar di ujung yang lain sebelum mencoba mengurai.
Hot Licks
1
@Jeach - Ini adalah kesalahan koding yang umum. Hanya menunggu pesan respons pertama dari permintaan vs menunggu yang terakhir dan menggabungkan data respons bersama-sama. Setiap respons akan berisi paling banyak 8K, jadi untuk data yang lebih lama, banyak respons digunakan.
Hot Licks
1
@Jeach - Jika Anda melakukan ini di iOS, dengan NSURLConnectionh standar, Anda perlu menerapkan connectionDidFinishLoadingdan melakukan terjemahan JSON di sana (atau setelah itu disebut), bukan di didReceiveData( di mana Anda harus menyatukan data yang diterima dengan tanggal sebelumnya diterima). Lingkungan lain serupa.
Hot Licks

Jawaban:

141

JSON mirip dengan format data lain seperti XML - jika Anda perlu mengirim lebih banyak data, Anda hanya mengirim lebih banyak data. Tidak ada batasan ukuran yang melekat pada permintaan JSON. Batasan apa pun akan ditetapkan oleh server untuk menguraikan permintaan. (Misalnya, ASP.NET memiliki properti "MaxJsonLength" dari serializer.)

Amber
sumber
1
jadi secara teknis, Jika saya ingin mengambil kode sumber SELURUH ke seluruh halaman ini, itu dapat dikirim sebagai objek json?
JasonDavis
Kode halaman ini sebenarnya hanya 6.7kb (tidak termasuk sumber daya eksternal). Itu mudah dilakukan dengan sembarang jenis permintaan HTTP.
Amber
15
Mungkin perlu dicatat bahwa "default adalah 2097152 karakter, yang setara dengan 4 MB data string Unicode" untuk properti yang JavaScriptSerializer.MaxJsonLengthdisebutkan dalam jawaban Amber. (NB saya kutip dari MSDN )
dumbledad
Jadi bagaimana saya mengurai objek JSON 155kb?
Ray
2
@AsadHasan Server dapat mengurai atau membuat serial, tergantung ke arah mana data akan dikirim.
Amber
18

Tidak ada batasan tetap tentang seberapa besar blok data JSON atau bidang apa pun.

Ada batasan untuk seberapa JSON implementasi JavaScript dari berbagai browser dapat menangani (misalnya sekitar 40MB dalam pengalaman saya). Lihat pertanyaan ini misalnya .

cdiggins
sumber
4
8K adalah batas yang sangat kecil untuk JSON. Saya menduga itu bukan batas untuk JSON, melainkan data sedang dikirim dalam blok 8K, dan kode yang menerima data sedang mencoba untuk menghapus bakteri dari blok individual daripada menunggu seluruh muatan tiba.
Hot Licks
Saya yakin Anda benar Hot Licks. Saya memperbarui jawaban saya.
cdiggins
9

Itu tergantung pada implementasi penulis / parser JSON Anda. Microsoft DataContractJsonSerializer tampaknya memiliki batas keras sekitar 8kb (8192 saya pikir), dan itu akan keluar untuk string yang lebih besar.

Sunting: Kami dapat menyelesaikan batas 8K untuk string JSON dengan menyetel properti MaxJsonLength di konfigurasi web seperti yang dijelaskan dalam jawaban ini: https://stackoverflow.com/a/1151993/61569

Anthony F
sumber
5
"Batas" 8K hampir pasti merupakan batas blok transmisi data, bukan batas untuk dokumen JSON. String yang lebih besar dapat diproses dengan memasang kembali transmisi multi-blok dengan benar.
Hot Licks
Sudah lama sejak kami menemukan cara mengubah batas 8K di DataContractJsonSerializer, tapi saya pikir itu adalah pengaturan "MaxJsonLength" ( msdn.microsoft.com/en-us/library/… )
Anthony F
5

Sebenarnya tidak ada batasan pada ukuran data JSON untuk dikirim atau terima. Kami dapat mengirim data Json dalam file juga. Menurut kemampuan browser yang Anda gunakan, data Json dapat ditangani.

Chaitanya Belsare
sumber
5

Implementasi bebas menentukan batas pada dokumen JSON, termasuk ukurannya, jadi pilih parser Anda dengan bijak. Lihat RFC 7159 , Bagian 9. Parsers:

"Suatu implementasi dapat menetapkan batas pada ukuran teks yang diterimanya. Suatu implementasi dapat menetapkan batas pada kedalaman maksimum dari sarang. Suatu implementasi dapat menetapkan batasan pada kisaran dan ketepatan angka. Suatu implementasi dapat menetapkan batas pada panjang dan karakter isi string. "

stleary
sumber
3

Jika Anda bekerja dengan ASP.NET MVC, Anda bisa menyelesaikan masalah dengan menambahkan MaxJsonLength ke hasil Anda:

var jsonResult = Json(new
{
    draw = param.Draw,
    recordsTotal = count,
    recordsFiltered = count,
    data = result
}, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = int.MaxValue;
mathias.horn
sumber
Tapi ini membuat max sekitar 4MB, dan kami membutuhkannya lebih tinggi. Bagaimana kita bisa menangani skenario itu?
Casey
@Casey - gejala apa yang terjadi pada Anda di atas 4MB? menandatangani integer 32-bit mencapai 2 miliar - pasti ada sesuatu di tempat lain yang membatasi ukuran Anda. Nilai default MaxJsonLength adalah 2M Unicode chars, jadi 4MB. Kode di atas meningkatkan MaxJsonLength ke nilai yang jauh lebih besar. Mungkin int.MaxValueditolak sebagai "terlalu besar" - coba ukuran lain, dan lihat seberapa besar Anda bisa.
ToolmakerSteve
Anda tahu, Anda benar. Saya mungkin mendapatkan gelembung kesalahan naik, atau tidak memanfaatkan pengaturan. Saya mencoba melakukan pre controller ini, bukan pada hasilnya. Ketika saya mencoba mengirim objek Json yang besar ke panggilan controller, jika saya menggunakan alat pengembang dan men-debug sisi server permintaan mengembalikan ukuran melebihi batas Json.
Casey
Ini adalah masalah saya, bagaimana menyiasatinya per situs web Microsoft. "Pada dasarnya, JavaScriptSerializer" internal "menghargai nilai maxJsonLength ketika dipanggil dari metode web. Penggunaan langsung JavaScriptSerializer (atau menggunakan melalui metode-aksi / Pengontrol MVC) tidak menghormati properti maxJsonLength, setidaknya tidak dari sistemWebExtensions .scripting.webServices.jsonSerialisasi bagian yang Anda tetapkan dalam file web.config. "
Casey
Saya hampir bertanya-tanya apakah saya bisa mengatakan, memecah apa pun lebih dari 50k menjadi potongan-potongan seperti List <type string>, lalu kirim itu ke controller, dan lakukan string bulder, kemudian impor ke SQL.
Casey
2

Tentunya semua orang melewatkan trik di sini. Batas ukuran file saat ini dari file json adalah 18.446.744.073.709.551.616 karakter atau jika Anda lebih suka byte, atau bahkan 2 ^ 64 byte jika Anda melihat setidaknya infrastruktur 64 bit.

Untuk semua maksud, dan tujuan kami dapat menganggapnya tidak terbatas karena Anda mungkin akan mengalami kesulitan untuk mencapai masalah ini ...

Perfect64
sumber
-6

Panjang maksimum string JSON. Standarnya adalah 2097152 karakter, yang setara dengan 4 MB data string Unicode.

Lihat URL di bawah ini

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

Shashi Keshar
sumber
2
JSON sendiri tidak memiliki batas bawaan. Apa yang Anda poskan khusus untuk .net dan JavaScriptSerializerkelasnya. Dan MaxJsonLengthsudah dibahas dalam jawaban lain.
David Makogon
Adakah yang bisa memposting cara menangani yang lebih besar dari .NET JavaScriptSerializer? Sebagai contoh, bagaimana saya bisa mengirim json besar ke pengontrol MVC tetapi menggunakan serializer Newtonsoft untuk menanganinya atau apakah ini tidak mungkin karena ini dibangun ke dalam .NET dan menggunakan pre-controller yang sedang digunakan?
Casey