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 ShouldSerialize
metod w klasie.
Aby użyć tej funkcji, dodaj ShouldSerializeBlah()
do klasy metodę logiczną , w której Blah
zostanie 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 ShouldSerialize
metody, możesz użyć narzędzia an, IContractResolver
aby 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.SerializeObject
do 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 Config
klasa:
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; }
}