W rzeczywistości istnieje kilka dość prostych podejść, których możesz użyć, aby osiągnąć pożądany rezultat.
Załóżmy na przykład, że masz obecnie zdefiniowane klasy w następujący sposób:
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
I chcesz to zrobić:
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);
Aby to uzyskać:
{"ReplacementSetting":{"Value":"Gamma"}}
Podejście 1: Dodaj metodę ShouldSerialize
Json.NET może warunkowo serializować właściwości, szukając odpowiednich ShouldSerializemetod w klasie.
Aby użyć tej funkcji, dodaj ShouldSerializeBlah()do klasy metodę logiczną , w której Blahzostanie zastąpiona nazwą właściwości, której nie chcesz serializować. Spraw, aby implementacja tej metody zawsze zwracała false.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Uwaga: jeśli podoba ci się to podejście, ale nie chcesz zagmatwać publicznego interfejsu swojej klasy przez wprowadzenie ShouldSerializemetody, możesz użyć narzędzia an, IContractResolveraby zrobić to samo programowo. Zobacz Serializacja właściwości warunkowych w dokumentacji.
Podejście 2: manipuluj JSON za pomocą JObjects
Zamiast używać JsonConvert.SerializeObjectdo serializacji, załaduj obiekt config do a JObject, a następnie po prostu usuń niechcianą właściwość z JSON przed jej zapisaniem. To tylko kilka dodatkowych linii kodu.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
Podejście 3: Sprytne (nad) wykorzystanie atrybutów
- Zastosuj
[JsonIgnore]atrybut do właściwości, której nie chcesz serializować.
- Dodaj alternatywną, prywatną metodę ustawiającą właściwości do klasy o tym samym typie, co oryginalna właściwość. Spraw, aby implementacja tej właściwości ustawiała oryginalną właściwość.
- Zastosuj
[JsonProperty]atrybut do alternatywnej metody ustawiającej, nadając jej taką samą nazwę JSON, jak oryginalna właściwość.
Oto poprawiona Configklasa:
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; }
}