Esistono in realtà diversi approcci abbastanza semplici che puoi utilizzare per ottenere il risultato desiderato.
Supponiamo, ad esempio, che le tue classi siano attualmente definite in questo modo:
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 vuoi fare questo:
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);
Per ottenere questo:
{"ReplacementSetting":{"Value":"Gamma"}}
Approccio 1: aggiungi un metodo ShouldSerialize
Json.NET ha la capacità di serializzare in modo condizionale le proprietà cercando i corrispondenti ShouldSerialize
metodi nella classe.
Per utilizzare questa funzionalità, aggiungi un ShouldSerializeBlah()
metodo booleano alla tua classe dove Blah
viene sostituito con il nome della proprietà che non desideri serializzare. Fare in modo che l'implementazione di questo metodo ritorni sempre false
.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Nota: se ti piace questo approccio ma non vuoi confondere l'interfaccia pubblica della tua classe introducendo un ShouldSerialize
metodo, puoi usare an IContractResolver
per fare la stessa cosa a livello di programmazione. Vedere Serializzazione condizionale delle proprietà nella documentazione.
Approccio 2: manipola il JSON con JObjects
Invece di utilizzare JsonConvert.SerializeObject
per eseguire la serializzazione, caricare l'oggetto di configurazione in un JObject
, quindi rimuovere semplicemente la proprietà indesiderata dal JSON prima di scriverlo. Sono solo un paio di righe di codice extra.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
Approccio 3: uso intelligente (ab) degli attributi
- Applicare a
[JsonIgnore]
attributo alla proprietà che non si desidera serializzare.
- Aggiungi un alternativo, privato setter di proprietà alla classe con lo stesso tipo della proprietà originale. Rendere l'implementazione di quella proprietà impostare la proprietà originale.
- Applica un
[JsonProperty]
attributo al setter alternativo, assegnandogli lo stesso nome JSON della proprietà originale.
Ecco la Config
classe rivista :
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; }
}