Sebenarnya ada beberapa pendekatan yang cukup sederhana yang dapat Anda gunakan untuk mencapai hasil yang Anda inginkan.
Mari kita asumsikan, misalnya, bahwa kelas Anda saat ini ditentukan seperti ini:
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
Dan Anda ingin melakukan ini:
string json = @"{ ""ObsoleteSetting"" : ""Gamma"" }";
// deserialize
Config config = JsonConvert.DeserializeObject<Config>(json);
// migrate
config.ReplacementSetting =
new Bang { Value = config.ObsoleteSetting.ToString() };
// serialize
json = JsonConvert.SerializeObject(config);
Console.WriteLine(json);
Untuk mendapatkan ini:
{"ReplacementSetting":{"Value":"Gamma"}}
Pendekatan 1: Tambahkan metode ShouldSerialize
Json.NET memiliki kemampuan untuk membuat serialisasi properti secara bersyarat dengan mencari ShouldSerializemetode yang sesuai di kelas.
Untuk menggunakan fitur ini, tambahkan ShouldSerializeBlah()metode boolean ke kelas Anda yang Blahakan diganti dengan nama properti yang tidak ingin Anda buat serialnya. Jadikan penerapan metode ini selalu kembali false.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Catatan: jika Anda menyukai pendekatan ini tetapi tidak ingin merusak antarmuka publik kelas Anda dengan memperkenalkan ShouldSerializemetode, Anda dapat menggunakan IContractResolveruntuk melakukan hal yang sama secara terprogram. Lihat Serialisasi Properti Bersyarat dalam dokumentasi.
Pendekatan 2: Memanipulasi JSON dengan JObjects
Alih-alih menggunakan JsonConvert.SerializeObjectuntuk melakukan serialisasi, muat objek config ke a JObject, lalu hapus properti yang tidak diinginkan dari JSON sebelum menulisnya. Itu hanya beberapa baris kode tambahan.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
Pendekatan 3: Penggunaan atribut yang cerdik (ab)
- Menerapkan
[JsonIgnore]atribut ke properti yang Anda tidak ingin menjadi serial.
- Tambahkan alternatif, penyetel properti pribadi ke kelas dengan tipe yang sama dengan properti asli. Jadikan implementasi properti itu sebagai properti asli.
- Menerapkan
[JsonProperty]atribut ke penyetel alternatif, memberinya nama JSON yang sama dengan properti aslinya.
Inilah Configkelas yang direvisi :
class Config
{
[JsonIgnore]
public Fizz ObsoleteSetting { get; set; }
[JsonProperty("ObsoleteSetting")]
private Fizz ObsoleteSettingAlternateSetter
{
// get is intentionally omitted here
set { ObsoleteSetting = value; }
}
public Bang ReplacementSetting { get; set; }
}