มีวิธีง่ายๆหลายวิธีที่คุณสามารถใช้เพื่อให้ได้ผลลัพธ์ที่คุณต้องการ
ตัวอย่างเช่นสมมติว่าคุณมีคลาสของคุณที่กำหนดไว้เช่นนี้:
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เพื่อทำสิ่งเดียวกันโดยทางโปรแกรม ดูConditional Property Serializationในเอกสารประกอบ
แนวทางที่ 2: จัดการ JSON ด้วย JObjects
แทนที่จะใช้JsonConvert.SerializeObjectเพื่อทำการทำให้เป็นอนุกรมให้โหลดออบเจ็กต์ config ลงใน 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]แอ็ตทริบิวต์กับ setter ทางเลือกโดยให้ชื่อ 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; }
}