json.net (newtonsoft)
Saya melihat-lihat dokumentasi tetapi saya tidak dapat menemukan apa pun tentang ini atau cara terbaik untuk melakukannya.
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
JsonConvert.Deserialize<List<Base>>(text);
Sekarang saya memiliki objek Berasal dalam daftar serial. Bagaimana cara menghapus nama daftar dan mendapatkan kembali jenis turunan?
c#
json
serialization
json.net
Akan
sumber
sumber
Jawaban:
Jika Anda menyimpan tipe di Anda
text
(sebagaimana seharusnya dalam skenario ini), Anda dapat menggunakanJsonSerializerSettings
.Lihat: cara deserialisasi JSON menjadi <BaseType> IEnumerable dengan Newtonsoft JSON.NET
Berhati-hatilah. Menggunakan apa pun selain
TypeNameHandling = TypeNameHandling.None
dapat membuka diri Anda pada kerentanan keamanan .sumber
TypeNameHandling = TypeNameHandling.Auto
- ini akan menambahkan$type
properti HANYA untuk instance di mana jenis yang dideklarasikan (yaituBase
) tidak cocok dengan jenis instance (yaituDerived
). Dengan cara ini, JSON Anda tidak terlalu membengkakTypeNameHandling.All
.Anda harus mengaktifkan Type Name Handling dan meneruskannya ke (de) serializer sebagai parameter pengaturan.
Ini akan menghasilkan deserialisasi kelas turunan yang benar. Kekurangannya adalah itu akan memberi nama semua objek yang Anda gunakan, karena itu akan memberi nama daftar tempat Anda meletakkan objek.
sumber
TypeNameHandling.Auto
akan melakukannya juga, dan lebih bagus karena tidak menulis nama tipe instance ketika cocok dengan tipe bidang / properti, yang sering terjadi pada sebagian besar bidang / properti.Karena pertanyaan ini sangat populer, mungkin berguna untuk menambahkan apa yang harus dilakukan jika Anda ingin mengontrol nama properti tipe dan nilainya.
Cara yang panjang adalah menulis custom
JsonConverter
s untuk menangani (de) serialisasi dengan secara manual memeriksa dan mengatur properti type.Cara yang lebih sederhana adalah dengan menggunakan JsonSubTypes , yang menangani semua boilerplate melalui atribut:
sumber
Gunakan JsonKnownTypes ini , cara penggunaannya sangat mirip, hanya menambahkan diskriminator ke json:
Sekarang ketika Anda cerita bersambung objek dalam json akan menambah
"$type"
dengan"base"
dan"derived"
nilai dan akan digunakan untuk deserializeContoh daftar berseri:
sumber