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

如何通过Newtonsoft JSON实现反序列化与序列化的不同属性名映射

如何通过Newtonsoft JSON实现反序列化与序列化的不同属性名映射

没问题!这个需求完全能搞定,我之前做项目的时候也遇到过一模一样的场景,Newtonsoft JSON(也就是咱们常说的Json.NET)给了好几种灵活的方案,我给你分享两个最实用的:

方法一:用私有辅助属性快速实现

这种方法不用写复杂的配置,适合快速解决单个属性的映射需求。你只需要在类里加一个只负责接收反序列化值的私有辅助属性,具体代码如下:

public class YourClass
{
    // 这是你原本的属性,序列化时会输出为"Service"
    public string Service { get; set; }

    // 这个私有辅助属性只负责反序列化时接收JSON里的"ServiceName"
    [JsonProperty("ServiceName")]
    private string ServiceName
    {
        set { Service = value; }
    }
}

原理很简单:反序列化的时候,Json.NET会识别到这个带[JsonProperty("ServiceName")]的私有属性,把JSON里的"ServiceName"值赋值给它,进而同步到你的Service属性里。而序列化的时候,因为这个辅助属性是私有且只有set访问器,Json.NET默认不会序列化它,所以最终输出的JSON里只会有"Service"字段,完全符合你的要求。

方法二:用自定义ContractResolver批量灵活控制

如果你的项目里有很多类似的「反序列化和序列化属性名不一致」的需求,用自定义ContractResolver会更优雅,不用每个属性都加辅助字段。具体步骤如下:

首先创建一个自定义的ContractResolver,在里面指定特定属性的映射规则:

public class CustomMappingResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        // 针对Service属性,指定反序列化时用"ServiceName"
        if (member.Name == nameof(YourClass.Service))
        {
            property.PropertyName = "ServiceName";
        }

        return property;
    }
}

然后使用的时候,反序列化用这个自定义Resolver,序列化用默认的配置即可:

// 反序列化:用自定义Resolver把JSON里的ServiceName映射到Service属性
var deserializeSettings = new JsonSerializerSettings
{
    ContractResolver = new CustomMappingResolver()
};
string inputJson = "{\"ServiceName\": \"测试服务\"}";
var yourObj = JsonConvert.DeserializeObject<YourClass>(inputJson, deserializeSettings);

// 序列化:用默认设置,输出原属性名"Service"
var outputJson = JsonConvert.SerializeObject(yourObj);
// 最终输出的JSON是 {"Service":"测试服务"}

这种方法的好处是,所有的映射规则都集中在Resolver里,后期维护起来非常方便,要加新的映射规则直接在Resolver里改就行。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:43:01