反序列化移除JSON字段下划线:CustomConverter与DefaultContractResolver选型及实现
JSON下划线字段映射实体类的最优方案与实现
方案选择:优先使用DefaultContractResolver
对比CustomConverter和DefaultContractResolver,DefaultContractResolver是更优的选择,核心原因:
- 通用性强:一次配置即可覆盖所有实体类的字段映射,无需为每个实体单独编写转换器
- 原生兼容:属于Json.NET的契约解析体系,不会破坏原有序列化/反序列化逻辑,支持嵌套对象自动处理
- 维护成本低:新增实体类无需额外修改配置,自动适配字段映射规则
DefaultContractResolver实现代码
自定义契约解析器,实现下划线分隔字段名到实体类大驼峰字段名的转换:
public class UnderscoreToPascalCaseResolver : DefaultContractResolver { protected override string ResolvePropertyName(string propertyName) { if (string.IsNullOrEmpty(propertyName)) return propertyName; // 将下划线分隔的字段名转换为大驼峰格式 var parts = propertyName.Split('_'); return string.Concat(parts.Select(part => string.IsNullOrEmpty(part) ? part : char.ToUpper(part[0]) + part.Substring(1))); } }
使用方式
配置JsonSerializerSettings后全局生效:
var jsonSettings = new JsonSerializerSettings { ContractResolver = new UnderscoreToPascalCaseResolver() }; // 反序列化示例 var entity = JsonConvert.DeserializeObject<YourEntityType>(jsonString, jsonSettings);
若坚持使用CustomConverter的解决方案
如果必须通过自定义转换器实现,可通过遍历JObject属性并重命名的方式完成映射:
public class IgnoreUnderScoreConverter<T> : JsonConverter<T> { public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer) { JObject originalJObject = JObject.Load(reader); JObject renamedJObject = new JObject(); // 遍历所有属性,移除下划线并重命名 foreach (var prop in originalJObject.Properties()) { string newPropName = RemoveUnderscores(prop.Name); renamedJObject[newPropName] = prop.Value; } // 将重命名后的JObject反序列化为实体类 return renamedJObject.ToObject<T>(serializer); } private string RemoveUnderscores(string input) { if (string.IsNullOrEmpty(input)) return input; var parts = input.Split('_'); return string.Concat(parts.Select(part => string.IsNullOrEmpty(part) ? part : char.ToUpper(part[0]) + part.Substring(1))); } // 如需支持实体类转JSON时添加下划线,可实现WriteJson方法 public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer) { JObject originalJObject = JObject.FromObject(value); JObject renamedJObject = new JObject(); foreach (var prop in originalJObject.Properties()) { string newPropName = AddUnderscores(prop.Name); renamedJObject[newPropName] = prop.Value; } renamedJObject.WriteTo(writer); } private string AddUnderscores(string input) { if (string.IsNullOrEmpty(input)) return input; StringBuilder sb = new StringBuilder(); sb.Append(input[0]); for (int i = 1; i < input.Length; i++) { if (char.IsUpper(input[i])) sb.Append('_'); sb.Append(input[i]); } return sb.ToString(); } public override bool CanWrite => true; }
使用方式
反序列化时指定转换器:
var entity = JsonConvert.DeserializeObject<YourEntityType>(jsonString, new IgnoreUnderScoreConverter<YourEntityType>());
内容的提问来源于stack exchange,提问作者marifrahman
相关产品推荐
相关产品推荐

