На самом деле существует несколько довольно простых подходов, которые вы можете использовать для достижения желаемого результата.
Предположим, например, что у вас в настоящее время определены ваши классы следующим образом:
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(json);
// migrate
config.ReplacementSetting =
new Bang { Value = config.ObsoleteSetting.ToString() };
// serialize
json = JsonConvert.SerializeObject(config);
Console.WriteLine(json);
Чтобы получить это:
{"ReplacementSetting":{"Value":"Gamma"}}
Json. NET имеет возможность условно сериализовать свойства, ища соответствующие методы ShouldSerialize
в классе.
Чтобы использовать эту функцию, добавьте в ваш класс метод boolean ShouldSerializeBlah()
, где Blah
заменяется именем свойства, которое вы не хотите сериализовать. Сделать реализацию этого метода всегда возвращать false
.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Примечание: если вам нравится этот подход, но вы не хотите испортить публичный интерфейс своего класса, введя ShouldSerialize
метод, вы можете использовать IContractResolver
, чтобы сделать то же самое программно. См. Сериализация условных свойств в документации.
Вместо использования JsonConvert.SerializeObject
для выполнения сериализации загрузите config в JObject
, а затем просто удалите нежелательное свойство из JSON перед его записью. Это всего лишь пара дополнительных строк кода.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
[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; }
}