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

反序列化移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:24:49