使用Newtonsoft Json序列化时如何忽略DataMember指定的属性短名称?
基于Newtonsoft.Json实现同个类两种序列化规则的方案
Newtonsoft.Json支持通过JsonSerializerSettings配置不同的序列化行为,无需修改原有类定义,即可实现两套序列化规则:一套沿用[DataMember]指定的短名称用于DynamoDB存储,一套使用属性原名用于前端推送。
步骤1:实现自定义ContractResolver
自定义序列化解析器,强制使用属性原始名称,忽略[DataMember]指定的短名称:
using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System.Reflection; public class IgnoreDataMemberNameContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var property = base.CreateProperty(member, memberSerialization); // 直接使用属性的原始声明名称,覆盖DataMember的Name配置 property.PropertyName = member.Name; return property; } }
步骤2:不同场景使用对应序列化配置
存入DynamoDB场景:直接沿用原有默认序列化逻辑即可,默认会读取
[DataMember]的短名称输出
示例代码:var userState = new UserState(); // 输出短属性名的JSON,用于DynamoDB存储 string dynamoDbJson = JsonConvert.SerializeObject(userState);输出效果:
{"tis":["table1","table2"],"wp":{"table1":10},"ut":"2024-05-20T12:00:00Z"}前端推送场景:序列化时指定使用自定义的ContractResolver,即可输出完整属性原名
示例代码:var frontendSerializeSettings = new JsonSerializerSettings { ContractResolver = new IgnoreDataMemberNameContractResolver() }; var userState = new UserState(); // 输出完整属性名的JSON,用于前端推送 string frontendJson = JsonConvert.SerializeObject(userState, frontendSerializeSettings);输出效果:
{"TableIds":["table1","table2"],"PositionByTableId":{"table1":10},"UpdatedTime":"2024-05-20T12:00:00Z"}
补充说明
如果需要反序列化前端返回的完整属性名JSON,反序列化时也传入同样的frontendSerializeSettings即可正常解析。该方案无代码侵入性,不会影响原有存储场景的序列化逻辑。
内容的提问来源于stack exchange,提问作者Monku
相关产品推荐
相关产品推荐

