Aslında istediğiniz sonuca ulaşmak için kullanabileceğiniz oldukça basit birkaç yaklaşım vardır.
Örneğin, sınıflarınızın şu anda şu şekilde tanımlandığını varsayalım:
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
Ve bunu yapmak istiyorsun:
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);
Bunu almak için:
{"ReplacementSetting":{"Value":"Gamma"}}
Yaklaşım 1: ShouldSerialize yöntemi ekleyin
Json.NET, ShouldSerializesınıfta karşılık gelen yöntemleri arayarak özellikleri koşullu olarak serileştirme yeteneğine sahiptir .
Bu özelliği kullanmak ShouldSerializeBlah()için, sınıfınıza Blah, serileştirmek istemediğiniz özelliğin adıyla değiştirilen bir boole yöntemi ekleyin . Bu yöntemin uygulanmasını her zaman geri döndürün false.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Not: Bu yaklaşımı beğendiyseniz, ancak bir ShouldSerializeyöntem sunarak sınıfınızın genel arayüzünü bulanıklaştırmak IContractResolveristemiyorsanız, aynı şeyi programlı olarak yapmak için bir kullanabilirsiniz . Belgelerdeki Koşullu Özellik Serileştirme konusuna bakın .
Yaklaşım 2: JSON'u JObjects ile değiştirin
JsonConvert.SerializeObjectSerileştirmeyi yapmak için kullanmak yerine , config nesnesini bir içine yükleyin JObject, ardından yazmadan önce istenmeyen özelliği JSON'dan kaldırın. Sadece birkaç ekstra kod satırı.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
Yaklaşım 3: Özelliklerin akıllıca (ab) kullanımı
[JsonIgnore]Serileştirilmesini istemediğiniz özelliğe bir öznitelik uygulayın .
- Orijinal özellik ile aynı türdeki sınıfa alternatif, özel bir özellik ayarlayıcı ekleyin . Bu özelliğin uygulanmasının orijinal özelliği ayarlamasını sağlayın.
[JsonProperty]Alternatif ayarlayıcıya orijinal özellik ile aynı JSON adını vererek bir öznitelik uygulayın .
İşte revize edilmiş Configsınıf:
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; }
}