Il existe en fait plusieurs approches assez simples que vous pouvez utiliser pour obtenir le résultat souhaité.
Supposons, par exemple, que vos classes soient actuellement définies comme ceci:
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
Et vous voulez faire ceci:
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);
Pour obtenir ceci:
{"ReplacementSetting":{"Value":"Gamma"}}
Approche 1: ajouter une méthode ShouldSerialize
Json.NET a la capacité de sérialiser conditionnellement les propriétés en recherchant les ShouldSerialize
méthodes correspondantes dans la classe.
Pour utiliser cette fonctionnalité, ajoutez une ShouldSerializeBlah()
méthode booléenne à votre classe où Blah
est remplacé par le nom de la propriété que vous ne souhaitez pas sérialiser. Rendre l'implémentation de cette méthode toujours renvoyée false
.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Remarque: si vous aimez cette approche mais que vous ne voulez pas brouiller l'interface publique de votre classe en introduisant une ShouldSerialize
méthode, vous pouvez utiliser un IContractResolver
pour faire la même chose par programme. Voir Sérialisation conditionnelle des propriétés dans la documentation.
Approche 2: Manipuler le JSON avec JObjects
Au lieu d'utiliser JsonConvert.SerializeObject
pour faire la sérialisation, chargez l'objet de configuration dans un JObject
, puis supprimez simplement la propriété indésirable du JSON avant de l'écrire. C'est juste quelques lignes de code supplémentaires.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
Approche 3: Utilisation intelligente (ab) des attributs
- Appliquez un
[JsonIgnore]
attribut à la propriété que vous ne souhaitez pas sérialiser.
- Ajoutez un autre setter de propriété privée à la classe avec le même type que la propriété d'origine. Faites de l'implémentation de cette propriété la propriété d'origine.
- Appliquez un
[JsonProperty]
attribut à l'autre setter, en lui donnant le même nom JSON que la propriété d'origine.
Voici la Config
classe révisée :
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; }
}