En realidad, existen varios enfoques bastante simples que puede utilizar para lograr el resultado que desea.
Supongamos, por ejemplo, que tiene sus clases actualmente definidas así:
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
Y quieres hacer esto:
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 esto:
{"ReplacementSetting":{"Value":"Gamma"}}
Enfoque 1: agregar un método ShouldSerialize
Json.NET tiene la capacidad de serializar condicionalmente propiedades buscando los ShouldSerialize
métodos correspondientes en la clase.
Para usar esta función, agregue un ShouldSerializeBlah()
método booleano a su clase donde Blah
se reemplaza con el nombre de la propiedad que no desea serializar. Haz que la implementación de este método siempre regrese false
.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Nota: si le gusta este enfoque pero no quiere enturbiar la interfaz pública de su clase introduciendo un ShouldSerialize
método, puede usar an IContractResolver
para hacer lo mismo mediante programación. Consulte Serialización de propiedad condicional en la documentación.
Enfoque 2: manipular JSON con JObjects
En lugar de usar JsonConvert.SerializeObject
para hacer la serialización, cargue el objeto de configuración en unJObject
, luego simplemente elimine la propiedad no deseada del JSON antes de escribirlo. Son solo un par de líneas adicionales de código.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
Enfoque 3: uso inteligente (ab) de los atributos
- Aplicar un
[JsonIgnore]
atributo a la propiedad que no desea serializar.
- Agrega una alternativa, establecedor de propiedad privada a la clase con el mismo tipo que la propiedad original. Haga que la implementación de esa propiedad establezca la propiedad original.
- Aplicar un
[JsonProperty]
atributo al establecedor alternativo, dándole el mismo nombre JSON que la propiedad original.
Aquí está la Config
clase 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; }
}