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

如何在System.Text.Json中不使用JsonPropertyName映射下划线JSON到帕斯卡实体属性?

不用JsonPropertyName实现下划线JSON到帕斯卡实体的映射方案

方案1:自定义命名策略

System.Text.Json支持自定义命名策略,直接实现JsonNamingPolicy就能搞定命名转换:

  1. 写一个下划线转帕斯卡的策略类:
public class SnakeCaseToPascalCaseNamingPolicy : JsonNamingPolicy
{
    public override string ConvertName(string name)
    {
        if (string.IsNullOrEmpty(name))
            return name;
        
        // 按下划线分割,每个单词首字母大写后拼接
        var parts = name.Split('_');
        return string.Concat(parts.Select(part => 
            char.ToUpperInvariant(part[0]) + part.Substring(1).ToLowerInvariant()));
    }
}
  1. 序列化/反序列化时带上这个策略:
var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = new SnakeCaseToPascalCaseNamingPolicy(),
    WriteIndented = true // 可选,让输出格式更易读
};

// 反序列化示例
var json = "{\"user_name\":\"John\",\"email_address\":\"john@example.com\"}";
var user = JsonSerializer.Deserialize<User>(json, options);

// 序列化示例
var serializedJson = JsonSerializer.Serialize(user, options);

方案2:利用内置蛇形策略反向适配(.NET 5+)

如果你的JSON是标准全小写下划线命名,.NET 5及以上版本有内置的JsonNamingPolicy.SnakeCaseLower,但它仅支持帕斯卡转蛇形的单向转换,要实现反向映射还是自定义策略更直接。

额外注意点

  • 自定义策略是全局生效的,要是只有部分属性需要转换,这种方式会影响所有属性。这种场景可以结合JsonExtensionData处理个别字段,但如果大部分字段都是下划线转帕斯卡,全局策略的效率更高。
  • 要是有个别特殊字段需要单独映射,又不想用JsonPropertyName,直接在自定义策略里加例外逻辑就行:
public override string ConvertName(string name)
{
    // 例外字段:实体属性名对应JSON键
    var exceptions = new Dictionary<string, string>
    {
        { "SpecialField", "special_custom_key" }
    };
    
    if (exceptions.TryGetValue(name, out var jsonKey))
        return jsonKey;
    
    // 其他字段走下划线转帕斯卡逻辑
    var parts = name.Split('_');
    return string.Concat(parts.Select(part => 
        char.ToUpperInvariant(part[0]) + part.Substring(1).ToLowerInvariant()));
}

内容的提问来源于stack exchange,提问作者user14208541

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:22:50