Il existe en fait plusieurs approches assez simples que vous pouvez utiliser pour obtenir le résultat que vous souhaitez.
Supposons, par exemple, que vos classes soient actuellement définies comme suit :
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 tu veux faire ça :
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 ça :
{"ReplacementSetting":{"Value":"Gamma"}}
Approche 1 : ajouter une méthode ShouldSerialize
Json.NET a la capacité de sérialiser les propriétés de manière conditionnelle en recherchant les propriétés correspondantes. ShouldSerialize
dans la classe.
Pour utiliser cette fonctionnalité, ajoutez un booléen ShouldSerializeBlah()
à votre classe où Blah
est remplacé par le nom de la propriété que vous ne voulez pas sérialiser. Faites en sorte que l'implémentation de cette méthode renvoie toujours 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 fonction ShouldSerialize
vous pouvez utiliser une méthode IContractResolver
pour faire la même chose de manière programmatique. Voir Sérialisation conditionnelle des propriétés dans la documentation.
Approche 2 : Manipuler le JSON avec des JObjects
Au lieu d'utiliser JsonConvert.SerializeObject
pour effectuer la sérialisation, charger l'objet config dans un fichier JObject
il suffit alors de supprimer la propriété indésirable du JSON avant de l'écrire. Il ne s'agit que de 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 : (ab)utilisation intelligente des attributs
- Appliquer un
[JsonIgnore]
à la propriété que vous ne voulez pas sérialiser.
- Ajoutez un suppléant, privé à la classe avec le même type que la propriété d'origine. Faites en sorte que l'implémentation de cette propriété définisse la propriété originale.
- Appliquer un
[JsonProperty]
à la propriété alternative, en lui donnant le même nom JSON que la propriété originale.
Voici la version révisée Config
classe :
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; }
}