На самом деле существует несколько довольно простых подходов, которые можно использовать для достижения желаемого результата.
Предположим, например, что ваши классы в настоящее время определены следующим образом:
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для сериализации загрузите объект конфигурации в, а 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; }
}