Saya telah mendengar bahwa Json.NET lebih cepat daripada DataContractJsonSerializer, dan ingin mencobanya ...
Tapi saya tidak bisa menemukan metode apa pun di JsonConvert yang mengambil aliran daripada string.
Untuk deserialisasi file yang berisi JSON di WinPhone, misalnya, saya menggunakan kode berikut untuk membaca konten file menjadi string, dan kemudian deserialize ke JSON. Tampaknya sekitar 4 kali lebih lambat dalam pengujian (sangat ad-hoc) saya daripada menggunakan DataContractJsonSerializer untuk deserialisasi langsung dari aliran ...
// DCJS
DataContractJsonSerializer dc = new DataContractJsonSerializer(typeof(Constants));
Constants constants = (Constants)dc.ReadObject(stream);
// JSON.NET
string json = new StreamReader(stream).ReadToEnd();
Constants constants = JsonConvert.DeserializeObject<Constants>(json);
Apakah saya salah?
sumber
Versi Json.net saat ini tidak memungkinkan Anda untuk menggunakan kode jawaban yang diterima. Alternatif saat ini adalah:
Dokumentasi: Deserialize JSON dari aliran file
sumber
stream.Position = 0;
deserialize json saya dengan benar.sumber
JsonSerializer ser = JsonSerializer.Create(settings);
Anda dapat menentukan pengaturan mana yang akan digunakan selama de / serialisasi.Serialize
implementasi ini adalah bahwa itu menutupStream
lulus sebagai argumen, yang tergantung pada aplikasi dapat menjadi masalah. Dengan .NET 4.5+ Anda dapat menghindari masalah ini dengan menggunakanStreamWriter
konstruktor yang berlebihan dengan parameterleaveOpen
yang memungkinkan Anda membiarkan aliran terbuka.Saya telah menulis kelas ekstensi untuk membantu saya deserializing dari sumber JSON (string, stream, file).
Deserialisasi sekarang semudah menulis:
Semoga ini bisa membantu orang lain.
sumber
Using SomeJsonHelpersNamespace
mana diperlukan atau hapusthis
kata kunci dan gunakanJsonHelpers.CreateFromJsonString(someJsonString)
Pro : ini lebih mudah digunakan :)Encoding.Default
itu buruk karena akan berperilaku berbeda pada mesin yang berbeda (lihat peringatan besar di Microsoft docu). JSON diharapkan menjadi UTF-8 dan inilah yang diharapkan JsonSerializer. Seharusnya begituEncoding.UTF8
. Kode seperti ini akan menghasilkan string rusak atau gagal deserialize jika karakter non-ASCII digunakan.Saya tiba di pertanyaan ini mencari cara untuk melakukan streaming daftar objek terbuka ke
System.IO.Stream
dan membacanya dari ujung yang lain, tanpa buffering seluruh daftar sebelum mengirim. (Khususnya saya streaming objek tetap dari MongoDB melalui Web API.)@ Paul Tyng dan @Rivers melakukan pekerjaan yang sangat baik untuk menjawab pertanyaan awal, dan saya menggunakan jawaban mereka untuk membangun bukti konsep untuk masalah saya. Saya memutuskan untuk memposting aplikasi konsol pengujian saya di sini kalau-kalau ada orang lain yang menghadapi masalah yang sama.
Perhatikan bahwa Anda mungkin menerima pengecualian saat
AnonymousPipeServerStream
dibuang, saya mengabaikannya karena tidak relevan dengan masalah yang dihadapi.sumber
{"sign in":{"username":"nick"}}{"buy item":{"_id":"32321123"}}
dan perlu melihatnya sebagai dua fragmen JSON yang menandakan suatu peristiwa setiap kali ia membaca sebuah fragmen. Dalam nodejs ini dapat dilakukan dalam 3 baris kode.