Json.NET memproses strim JSON yang besar dalam persekitaran yang dikekang memori
Menghuraikan fail JSON yang mengandungi sejumlah besar objek serupa merupakan satu cabaran dalam persekitaran yang dikekang memori. Pertimbangkan senario berikut:
Fail JSON yang besar mengandungi banyak objek JSON dengan struktur yang sama. Jika setiap objek ialah fail yang berasingan, anda boleh menyahsiri objek satu demi satu. Walau bagaimanapun, disebabkan sifat data yang bersarang, menyahsiri secara langsung tatasusunan JSON objek ini akan mengeluarkan pengecualian yang mengatakan objek dijangka dan bukannya senarai.
Percubaan untuk menyahsiri keseluruhan fail JSON ke dalam senarai objek C# berjaya mengelakkan masalah membaca keseluruhan fail JSON ke dalam RAM. Walau bagaimanapun, ia memperkenalkan masalah baharu untuk mencipta objek senarai C# yang masih menyimpan semua data daripada fail JSON dalam ingatan.
Untuk mengatasi batasan ini, strategi diperlukan untuk membaca objek satu demi satu. Pendekatan ini menghapuskan keperluan untuk memuatkan keseluruhan rentetan JSON atau semua data ke dalam RAM sebagai objek C#.
Penyelesaian
Contoh kod berikut menggambarkan pendekatan ini:
<code class="language-csharp">JsonSerializer serializer = new JsonSerializer(); MyObject o; using (FileStream s = File.Open("bigfile.json", FileMode.Open)) using (StreamReader sr = new StreamReader(s)) using (JsonReader reader = new JsonTextReader(sr)) { while (reader.Read()) { // 只在流中存在"{"字符时才反序列化 if (reader.TokenType == JsonToken.StartObject) { o = serializer.Deserialize<MyObject>(reader); // 对o进行处理 } } }</code>
Kod ini mensimulasikan kaedah awal menyahsiri objek dalam gelung, tetapi ia hanya menyahsiri objek apabila pembaca menemui aksara "{" dalam strim. Pendekatan ini memproses aliran JSON dengan cekap tanpa menggunakan RAM secara berlebihan dengan melangkau ke objek seterusnya sehingga penanda objek permulaan lain ditemui. Ambil perhatian bahawa myobject
dalam kod telah diperbetulkan kepada MyObject
, dan ulasan tentang pemprosesan objek o
telah ditambahkan untuk memudahkan pengguna menambah operasi seterusnya mengikut situasi sebenar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghuraikan Strim JSON Besar dengan Cekap dengan RAM Terhad dalam Json.NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!