Saya memiliki kelas yang memiliki konstruktor default dan juga konstruktor kelebihan beban yang menggunakan satu set parameter. Parameter ini cocok dengan bidang pada objek dan ditugaskan pada konstruksi. Pada titik ini saya memerlukan konstruktor default untuk keperluan lain jadi saya ingin menyimpannya jika saya bisa.
Masalah saya: Jika saya menghapus konstruktor default dan meneruskan string JSON, objek deserializes dengan benar dan melewati parameter konstruktor tanpa masalah. Saya akhirnya mendapatkan kembali objek yang dihuni seperti yang saya harapkan. Namun, segera setelah saya menambahkan konstruktor default ke objek, ketika saya memanggil JsonConvert.DeserializeObject<Result>(jsontext)
properti tidak lagi diisi.
Pada titik ini saya telah mencoba menambahkan new JsonSerializerSettings(){CheckAdditionalContent = true}
panggilan deserialization. itu tidak melakukan apa-apa.
Catatan lain. parameter konstruktor benar-benar cocok dengan nama-nama bidang kecuali bahwa parameter dimulai dengan huruf kecil. Saya tidak akan berpikir ini akan menjadi masalah karena, seperti yang saya sebutkan, deserialisasi berfungsi dengan baik tanpa konstruktor default.
Berikut ini contoh konstruktor saya:
public Result() { }
public Result(int? code, string format, Dictionary<string, string> details = null)
{
Code = code ?? ERROR_CODE;
Format = format;
if (details == null)
Details = new Dictionary<string, string>();
else
Details = details;
}
Jawaban:
Json.Net lebih suka menggunakan konstruktor default (parameterless) pada objek jika ada. Jika ada beberapa konstruktor dan Anda ingin Json.Net menggunakan yang non-default, maka Anda dapat menambahkan
[JsonConstructor]
atribut ke konstruktor yang Anda ingin Json.Net panggil.Adalah penting bahwa nama parameter konstruktor cocok dengan nama properti yang sesuai dari objek JSON (mengabaikan kasus) agar ini berfungsi dengan benar. Namun, Anda tidak harus memiliki parameter konstruktor untuk setiap properti objek. Untuk properti objek JSON yang tidak tercakup oleh parameter konstruktor, Json.Net akan mencoba menggunakan pengakses properti publik (atau properti / bidang yang ditandai dengan
[JsonProperty]
) untuk mengisi objek setelah membangunnya.Jika Anda tidak ingin menambahkan atribut ke kelas Anda atau tidak mengontrol kode sumber untuk kelas yang Anda coba deserialize, maka alternatif lain adalah membuat JsonConverter kustom untuk instantiate dan mengisi objek Anda. Sebagai contoh:
Kemudian, tambahkan konverter ke pengaturan serializer Anda, dan gunakan pengaturan ketika Anda deserialize:
sumber
JsonConverter
untuk kelas Anda. Ini akan menghapus ketergantungan, tetapi Anda harus menangani instantiating dan mengisi sendiri objek di konverter. Mungkin juga untuk menulis sebuah kebiasaanContractResolver
yang akan mengarahkan Json.Net untuk menggunakan konstruktor lain dengan mengubahJsonObjectContract
, tetapi ini bisa terbukti sedikit lebih rumit daripada kedengarannya.using Newtonsoft.Json;
Agak terlambat dan tidak cocok di sini, tapi saya akan menambahkan solusi saya di sini, karena pertanyaan saya telah ditutup sebagai duplikat dari yang ini, dan karena solusi ini sangat berbeda.
Saya membutuhkan cara umum untuk menginstruksikan
Json.NET
untuk memilih konstruktor yang paling spesifik untuk tipe struct yang ditentukan pengguna, jadi saya dapat menghilangkanJsonConstructor
atribut yang akan menambah ketergantungan pada proyek di mana setiap struct tersebut didefinisikan.Saya telah sedikit merekayasa balik dan menerapkan penyelesaian kontrak khusus tempat saya mengganti
CreateObjectContract
metode untuk menambahkan logika kreasi khusus saya.Saya menggunakannya seperti ini.
sumber
objectType.IsValueType
) dan ini bekerja dengan baik, terima kasih!Berdasarkan beberapa jawaban di sini, saya telah menulis
CustomConstructorResolver
untuk digunakan dalam proyek saat ini, dan saya pikir itu mungkin membantu orang lain.Ini mendukung mekanisme resolusi berikut, semua dapat dikonfigurasi:
Newtonsoft.Json.JsonConstructorAttribute
.Berikut ini adalah versi lengkap dengan dokumentasi XML sebagai intisari: https://gist.github.com/maverickelementalch/80f77f4b6bdce3b434b0f7a1d06baa95
Umpan balik dihargai.
sumber
Perilaku default Newtonsoft.Json akan menemukan
public
konstruktor. Jika konstruktor default Anda hanya digunakan dalam berisi kelas atau rakitan yang sama, Anda dapat mengurangi tingkat akses keprotected
atauinternal
sehingga Newtonsoft.Json akan memilihpublic
konstruktor yang Anda inginkan .Diakui, solusi ini agak sangat terbatas pada kasus-kasus tertentu.
sumber
Larutan:
Model:
sumber