如何修改C#可JSON序列化类的属性名并保证向后兼容?
C# JSON序列化属性重命名向后兼容实现方案
问题根因
你遇到的重复值问题源于两个核心原因:
- 默认配置下
OldName和NewName都会参与序列化,生成的JSON同时包含两个字段 - Newtonsoft.Json(Json.NET)反序列化集合类型时,默认行为是向已有集合实例追加元素,而非替换整个实例,两个字段的值先后追加到同一个集合就会出现重复元素
正确实现代码
public class MyClass { [Obsolete("Use NewName instead", false)] // 第二个参数设为false表示仅触发警告,不阻断编译 [JsonProperty] // 保留反序列化能力,可识别JSON中的OldName字段 public List<string> OldName { get => NewName; set => NewName = value; } [JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)] // 反序列化时直接替换集合实例,避免追加重复 public List<string> NewName { get; set; } = new List<string>(); // Json.NET内置约定:返回false时对应属性不会被序列化到JSON中 public bool ShouldSerializeOldName() => false; }
需求匹配说明
- Obsolete警告:
[Obsolete]特性会对所有直接调用OldName的代码触发编译警告,符合要求 - 旧JSON兼容:
OldName保留[JsonProperty]特性,反序列化时可正常读取JSON中的OldName字段,自动映射到NewName - 新JSON仅输出NewName:
ShouldSerializeOldName()返回false,序列化时会自动忽略OldName字段,仅保留NewName - 无重复值问题:
- 序列化阶段不会同时输出两个字段,从根源避免反序列化时两次赋值
NewName配置了ObjectCreationHandling.Replace,即便遇到同时包含两个字段的特殊JSON,也会直接替换集合实例而非追加元素,不会出现重复
内容的提问来源于stack exchange,提问作者bwall
相关产品推荐
相关产品推荐

