Rumah >pembangunan bahagian belakang >C++ >Bagaimana cara deserialize Polymorphic JSON tanpa maklumat jenis menggunakan json.net?
Tidak perlu maklumat jenis diperlukan untuk menggunakan json.net Back -sequenticed Polymorphic JSON Class
json.net adalah perpustakaan Serialization dan Perpustakaan Desertilezation yang kuat. Walau bagaimanapun, apabila tidak ada jenis maklumat dalam data bersiri, polimorfisme kaunter -lebih banyak JSON mungkin mencabar.
<:> Soalan: Kekurangan maklumat jenis
Polimorfisme membolehkan pelbagai kelas mewarisi dari kelas asas awam. Apabila deeperularization mewakili data JSON objek polimorfik, jika tidak ada jenis maklumat, sukar untuk menentukan kelas mana yang harus ditegaskan.
Sebagai contoh, memandangkan data JSON berikut, ia menunjukkan bahawa imej galeri atau kelas album galeri:
atribut "is_album" dibezakan. "Is_album" imej galeri ditetapkan kepada palsu, dan album galeri ditetapkan untuk benar.
<code class="language-json">{ "id": "OUHDm", "title": "My most recent drawing. Spent over 100 hours.", "is_album": false }</code>Penyelesaian: jsonconveter
Untuk bergantung kepada JSON polimorfik ini, anda boleh membuat JsonConverrer tersuai untuk memproses contoh objek. Penukar memeriksa harta "is_album" dan buat contoh kelas yang sepadan. Ini adalah penukar sampel yang dipanggil GalleryItemConverter:
<code class="language-csharp">public class GalleryItemConverter : JsonConverter { // 指定转换器可以转换GalleryItem及其派生类 public override bool CanConvert(Type objectType) => typeof(GalleryItem).IsAssignableFrom(objectType); public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 将JSON读取为JObject JObject jo = JObject.Load(reader); // 检查"is_album"属性以确定类类型 bool? isAlbum = (bool?)jo["is_album"]; GalleryItem item; if (isAlbum.GetValueOrDefault()) item = new GalleryAlbum(); else item = new GalleryImage(); // 从JSON数据填充项目属性 serializer.Populate(jo.CreateReader(), item); return item; } }</code>Untuk menggunakan penukar, sila masukkannya sebagai parameter dalam Serializer Backlier Json.net lalai, seperti yang ditunjukkan di bawah:
Output contoh
Menggunakan data JSON dan penukar adat yang disediakan, anda boleh mendapatkan objek GalleryItem yang sepi:
<code class="language-csharp">var items = JsonConvert.DeserializeObject<List<GalleryItem>>(json, new GalleryItemConverter());</code>
Atas ialah kandungan terperinci Bagaimana cara deserialize Polymorphic JSON tanpa maklumat jenis menggunakan json.net?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!