Na verdade, existem várias abordagens bastante simples que você pode usar para alcançar o resultado desejado.
Vamos supor, por exemplo, que você tem suas classes atualmente definidas assim:
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
E você quer fazer isso:
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);
Para conseguir esta:
{"ReplacementSetting":{"Value":"Gamma"}}
Abordagem 1: Adicionar um método ShouldSerialize
Json.NET tem a capacidade de serializar propriedades condicionalmente, procurando por ShouldSerialize
métodos correspondentes na classe.
Para usar este recurso, adicione um ShouldSerializeBlah()
método booleano à sua classe, onde Blah
é substituído pelo nome da propriedade que você não deseja serializar. Faça a implementação deste método sempre retornar false
.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Observação: se você gosta dessa abordagem, mas não quer complicar a interface pública de sua classe com a introdução de um ShouldSerialize
método, pode usar um IContractResolver
para fazer a mesma coisa programaticamente. Consulte Serialização condicional de propriedade na documentação.
Abordagem 2: Manipular o JSON com JObjects
Em vez de usar JsonConvert.SerializeObject
para fazer a serialização, carregue o objeto de configuração em um JObject
e simplesmente remova a propriedade indesejada do JSON antes de escrevê-lo. São apenas algumas linhas extras de código.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
Abordagem 3: uso inteligente (ab) de atributos
- Aplique um
[JsonIgnore]
atributo à propriedade que você não deseja que seja serializada.
- Adicione um configurador de propriedade privado alternativo à classe com o mesmo tipo da propriedade original. Faça a implementação dessa propriedade definir a propriedade original.
- Aplique um
[JsonProperty]
atributo ao configurador alternativo, dando a ele o mesmo nome JSON da propriedade original.
Aqui está a Config
aula revisada :
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; }
}