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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:36:08