如何通过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
相关产品推荐
相关产品推荐

