Ketika saya membuat serial berikut ini:
[Serializable]
public class Error
{
public string Status { get; set; }
public string Message { get; set; }
public string ErrorReferenceCode { get; set; }
public List<FriendlyError> Errors { get; set; }
}
Saya mendapatkan kekacauan yang menjijikkan ini:
<ErrorRootOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Printmee.Api">
<_x003C_Errors_x003E_k__BackingField>
An exception has occurred. Please contact printmee support
</_x003C_Errors_x003E_k__BackingField>
<_x003C_LookupCode_x003E_k__BackingField>988232ec-6bc9-48f3-8116-7ff7c71302dd</_x003C_LookupCode_x003E_k__BackingField>
</ErrorRootOfstring>
Apa yang memberi? Bagaimana saya bisa membuatnya cantik? Respons JSON juga berisi k_BackingField
Jawaban:
Secara default, Anda tidak perlu menggunakan
[Serializable]
atau[DataContract]
bekerja dengan API Web.Biarkan model Anda sebagaimana adanya, dan Web API akan membuat serialisasi semua properti publik untuk Anda.
Hanya jika Anda ingin memiliki lebih banyak kendali tentang apa yang disertakan, Anda kemudian menghias kelas Anda dengan
[DataContract]
dan properti yang akan disertakan[DataMember]
(karena DCS dan JSON.NET menghormati atribut ini).Jika karena alasan tertentu, Anda memerlukan
[Serializable]
pada kelas Anda (yaitu Anda membuat serialisasi ke dalam aliran memori untuk beberapa alasan, melakukan salinan dalam, dll), maka Anda harus menggunakan kedua atribut dalam hubungannya untuk mencegah nama bidang dukungan:sumber
Ada solusi yang lebih umum: Anda dapat mengkonfigurasi Json Serializer untuk mengabaikan
[Serializable]
atribut, sehingga Anda tidak perlu mengubah atribut di kelas Anda.Anda harus membuat perubahan konfigurasi ini di awal aplikasi, yaitu di
Application_Start
acara Global.asax :Anda juga dapat membuat perubahan lain pada serialisasi Json, seperti menentukan format untuk serialisasi tanggal, dan banyak hal lainnya.
Ini hanya akan berlaku untuk serialisasi JSON API Web. Serialisasi lain dalam aplikasi (serialisasi XML API Web, MVC JsonResult ...) tidak akan terpengaruh oleh setelan ini.
sumber
Update-Package Newtonsoft.Json
.Coba gunakan DataContract daripada Serializable untuk menandai kelas Anda. Untuk detail selengkapnya tentang alasannya, lihat entri blog yang bagus ini tentang membuat serial properti otomatis.
sumber
Atribut [DataContract] tidak berfungsi untuk saya, jadi itu bukan opsi.
XmlSerializer mengabaikan [XmlAttribute] di WebApi
Resolusi di atas menyelesaikannya untuk saya.
sumber