Thực tế có một số cách tiếp cận khá đơn giản mà bạn có thể sử dụng để đạt được kết quả như mong muốn.
Ví dụ, giả sử rằng bạn có các lớp của mình hiện được định nghĩa như thế này:
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
Và bạn muốn làm điều này:
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);
Để có được điều này:
{"ReplacementSetting":{"Value":"Gamma"}}
Phương pháp 1: Thêm phương pháp ShouldSerialize
Json.NET có khả năng tuần tự hóa các thuộc tính có điều kiện bằng cách tìm kiếm ShouldSerialize
phương thức trong lớp.
Để sử dụng tính năng này, hãy thêm một ShouldSerializeBlah()
phương thức boolean vào lớp của bạn, nơi Blah
được thay thế bằng tên của thuộc tính mà bạn không muốn tuần tự hóa. Làm cho việc thực hiện phương pháp này luôn quay trở lại false
.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
Lưu ý: nếu bạn thích cách tiếp cận này nhưng bạn không muốn làm xáo trộn giao diện công khai của lớp bằng cách giới thiệu một ShouldSerialize
phương thức, bạn có thể sử dụng một IContractResolver
để làm điều tương tự theo chương trình. Xem Serialization thuộc tính có điều kiện thuộc trong tài liệu.
Phương pháp 2: Thao tác JSON với JObjects
Thay vì sử dụng JsonConvert.SerializeObject
để thực hiện tuần tự hóa, hãy tải đối tượng cấu hình vào a JObject
, sau đó chỉ cần xóa thuộc tính không mong muốn khỏi JSON trước khi viết ra. Nó chỉ là một vài dòng mã bổ sung.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
Cách tiếp cận 3: Sử dụng các thuộc tính thông minh (ab)
- Áp dụng một
[JsonIgnore]
thuộc tính cho thuộc tính mà bạn không muốn được tuần tự hóa.
- Thêm một thay thế, riêng tư thiết lập thuộc tính vào lớp có cùng kiểu với thuộc tính ban đầu. Làm cho việc thực hiện thuộc tính đó đặt thuộc tính ban đầu.
- Áp dụng một
[JsonProperty]
thuộc tính cho setter thay thế, đặt tên JSON giống như thuộc tính ban đầu.
Đây là Config
lớp đã sửa đổi :
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; }
}