Насправді є кілька досить простих підходів, якими ви можете скористатися для досягнення бажаного результату.
Припустимо, наприклад, що у вас зараз такі класи визначені так:
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
І ви хочете зробити це:
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);
Щоб отримати це:
{"ReplacementSetting":{"Value":"Gamma"}}
Підхід 1: Додайте метод ShouldSerialize
Json.NET має можливість умовно серіалізувати властивості, шукаючи відповідні ShouldSerializeметоди у класі.
Щоб скористатися цією функцією, додайте бульовий ShouldSerializeBlah()метод до свого класу, де Blahзамінено ім'я властивості, яке ви не хочете серіалізувати. Зробіть реалізацію цього методу завжди поверненою false.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Примітка: якщо вам подобається такий підхід, але ви не хочете замучувати публічний інтерфейс свого класу, вводячи ShouldSerializeметод, ви можете використовувати програму, IContractResolverщоб зробити те ж саме в програмному порядку. Дивіться умовну серіалізацію майна в документації.
Підхід 2: Керуйте JSON за допомогою JObjects
Замість того, JsonConvert.SerializeObjectщоб використовувати серіалізацію, завантажте конфігураційний об’єкт у a JObject, а потім просто видаліть небажане властивість з JSON перед тим, як виписати його. Це лише пара зайвих рядків коду.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
Підхід 3: Розумне (ab) використання атрибутів
- Застосуйте
[JsonIgnore]атрибут до властивості, яке ви не хочете серіалізувати.
- Додайте альтернативний інсталятор приватної власності до класу з тим же типом, що і оригінальний ресурс. Зробити реалізацію цього властивості встановити початкову властивість.
- Застосуйте
[JsonProperty]атрибут до альтернативного сеттера, давши йому те саме ім'я JSON, що і вихідне властивість.
Ось переглянений Configклас:
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; }
}