C#对象序列化使用自定义属性名且兼容原属性名反序列化问题
解决方案
方案1:使用 System.Text.Json(.NET Core 3.0+ / .NET 5+ 内置)
.NET 自带的序列化库可通过原生属性直接满足需求:
- 用
[JsonPropertyName]指定序列化输出的自定义属性名 - 用
[JsonAlias]指定反序列化时可识别的别名(填入原属性名即可)
代码示例:
using System.Text.Json.Serialization; public class YourClass { [JsonPropertyName("KLM")] [JsonAlias("ABC")] public string ABC { get; set; } = "Test1"; [JsonPropertyName("NOP")] [JsonAlias("DEF")] public string DEF { get; set; } = "Test2"; [JsonPropertyName("QRS")] [JsonAlias("GHI")] public string GHI { get; set; } = "Test3"; }
实现效果:
- 序列化输出:
{"KLM":"Test1","NOP":"Test2","QRS":"Test3"} - 反序列化时同时支持识别自定义属性名和原属性名,两种格式的JSON都可正常解析
方案2:使用 Newtonsoft.Json(Json.NET)
如果使用Newtonsoft.Json,可通过自定义ContractResolver实现别名兼容,无需修改你已有的属性标注:
- 保留你现有的属性定义:
using Newtonsoft.Json; public class YourClass { [JsonProperty(PropertyName = "KLM")] public string ABC { get; set; } = "Test1"; [JsonProperty(PropertyName = "NOP")] public string DEF { get; set; } = "Test2"; [JsonProperty(PropertyName = "QRS")] public string GHI { get; set; } = "Test3"; }
- 新增自定义属性解析器:
public class AliasContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var property = base.CreateProperty(member, memberSerialization); // 将原属性名加入反序列化识别列表 property.AlternateNames.Add(member.Name); return property; } }
- 反序列化时引入配置即可:
// 反序列化配置 var deserializeSettings = new JsonSerializerSettings { ContractResolver = new AliasContractResolver() }; // 反序列化带原属性名的JSON var obj = JsonConvert.DeserializeObject<YourClass>(inputJson, deserializeSettings); // 序列化直接输出自定义属性名,无需额外配置 var outputJson = JsonConvert.SerializeObject(obj);
内容的提问来源于stack exchange,提问作者GSKKC
相关产品推荐
相关产品推荐

