Es gibt tatsächlich mehrere ziemlich einfache Ansätze, mit denen Sie das gewünschte Ergebnis erzielen können.
Nehmen wir zum Beispiel an, Sie haben Ihre Klassen derzeit so definiert:
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
Und du willst das machen:
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);
Um dies zu bekommen:
{"ReplacementSetting":{"Value":"Gamma"}}
Ansatz 1: Fügen Sie eine ShouldSerialize-Methode hinzu
Json.NET kann Eigenschaften bedingt serialisieren, indem nach entsprechenden ShouldSerialize
Methoden in der Klasse gesucht wird .
Um diese Funktion zu verwenden, fügen Sie ShouldSerializeBlah()
Ihrer Klasse eine boolesche Methode hinzu, die Blah
durch den Namen der Eigenschaft ersetzt wird, die Sie nicht serialisieren möchten. Lassen Sie die Implementierung dieser Methode immer zurückkehren false
.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Hinweis: Wenn Ihnen dieser Ansatz gefällt, Sie aber die öffentliche Oberfläche Ihrer Klasse nicht durch die Einführung einer ShouldSerialize
Methode verwirren möchten , können Sie eine verwenden IContractResolver
, um dasselbe programmgesteuert auszuführen. Siehe Serielle Serialisierung von Eigenschaften in der Dokumentation.
Ansatz 2: Bearbeiten Sie den JSON mit JObjects
Anstatt JsonConvert.SerializeObject
die Serialisierung zu verwenden, laden Sie das Konfigurationsobjekt in a JObject
und entfernen Sie dann einfach die unerwünschte Eigenschaft aus dem JSON, bevor Sie sie ausschreiben. Es sind nur ein paar zusätzliche Codezeilen.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
Ansatz 3: Clevere (ab) Verwendung von Attributen
- Wenden Sie ein
[JsonIgnore]
Attribut auf die Eigenschaft an, die nicht serialisiert werden soll.
- Fügen Sie der Klasse einen alternativen Setter für private Eigenschaften mit demselben Typ wie die ursprüngliche Eigenschaft hinzu. Stellen Sie bei der Implementierung dieser Eigenschaft die ursprüngliche Eigenschaft ein.
- Wenden Sie ein
[JsonProperty]
Attribut auf den alternativen Setter an und geben Sie ihm denselben JSON-Namen wie die ursprüngliche Eigenschaft.
Hier ist die überarbeitete Config
Klasse:
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; }
}