You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改C#可JSON序列化类的属性名并保证向后兼容?

C# JSON序列化属性重命名向后兼容实现方案

问题根因

你遇到的重复值问题源于两个核心原因:

  1. 默认配置下OldName和NewName都会参与序列化,生成的JSON同时包含两个字段
  2. 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;
}

需求匹配说明

  1. Obsolete警告:[Obsolete]特性会对所有直接调用OldName的代码触发编译警告,符合要求
  2. 旧JSON兼容:OldName保留[JsonProperty]特性,反序列化时可正常读取JSON中的OldName字段,自动映射到NewName
  3. 新JSON仅输出NewName:ShouldSerializeOldName()返回false,序列化时会自动忽略OldName字段,仅保留NewName
  4. 无重复值问题:
    • 序列化阶段不会同时输出两个字段,从根源避免反序列化时两次赋值
    • NewName配置了ObjectCreationHandling.Replace,即便遇到同时包含两个字段的特殊JSON,也会直接替换集合实例而非追加元素,不会出现重复

内容的提问来源于stack exchange,提问作者bwall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:15:01