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

Newtonsoft CamelCase转换类属性疑问:ID转id而非iD?规则咨询

为什么Newtonsoft CamelCase没有把ID转成iD、CName转成cName?

嘿,这个问题挺常见的,咱们先从你遇到的现象说起,再拆解Newtonsoft CamelCase的规则,最后给你解决方法。

首先看你的C#类:

public class MyClass{ 
    public int ID {get;set;} 
    public string CName{get;set} 
    public string FirstName{get;set} 
}

用默认的CamelCasePropertyNamesContractResolver序列化后得到:

{ "id": 1, "cname": "xxx", "firstName": "xxx" }

(顺便提一句,你写的fistName应该是笔误,实际应该是firstName哈)

为什么默认规则会得到这样的结果?

Newtonsoft的CamelCase实现遵循的是微软官方的驼峰命名规范,核心规则可以拆解成这几点:

  • 首字母强制转为小写,不管后面的字符是什么
  • 对于后续的字符:
    • 如果前一个字符是小写,当前字符是大写,那么保留大写(比如FirstName里的S,前面是小写的t,所以转成firstName)
    • 如果前一个字符是大写,当前字符也是大写,那么把当前字符转为小写(比如CName里的N,前面是大写的C,所以转成cname;ID是两个连续大写,所以全部转成id)
    • 连续大写的后缀会统一转小写(比如HTMLTag会变成htmlTag)

简单说,默认规则不会保留开头连续大写的第二个字符的大写状态,所以ID变id,CName变cname。

怎么得到你期望的{ "iD": 1, "cName": "xxx", "firstName": "xxx" }?

有两种常用方法,看你需求选择:

方法一:直接给属性指定JSON别名

最直接的方式是用[JsonProperty]特性手动指定每个属性的JSON键名,适合只需要修改少数属性的场景:

public class MyClass{ 
    [JsonProperty("iD")]
    public int ID {get;set;} 
    [JsonProperty("cName")]
    public string CName{get;set} 
    public string FirstName{get;set} 
}

这样序列化后就会完全按照你指定的名称输出。

方法二:自定义驼峰规则解析器

如果有很多类似的属性需要修改规则,自定义一个ContractResolver更高效。我们可以继承默认的CamelCasePropertyNamesContractResolver,重写ResolvePropertyName方法来调整开头连续大写的处理逻辑:

public class CustomCamelCaseResolver : CamelCasePropertyNamesContractResolver
{
    protected override string ResolvePropertyName(string propertyName)
    {
        if (string.IsNullOrEmpty(propertyName))
            return propertyName;
        
        // 处理开头两个大写的情况:把第一个大写转小写,保留第二个大写
        if (propertyName.Length >= 2 && char.IsUpper(propertyName[0]) && char.IsUpper(propertyName[1]))
        {
            return char.ToLowerInvariant(propertyName[0]) + propertyName.Substring(1);
        }
        
        // 其他情况沿用默认规则
        return base.ResolvePropertyName(propertyName);
    }
}

使用的时候,把自定义解析器传给JsonSerializerSettings即可:

var myClass = new MyClass { ID = 1, CName = "xxx", FirstName = "xxx" };
var settings = new JsonSerializerSettings
{
    ContractResolver = new CustomCamelCaseResolver()
};
string json = JsonConvert.SerializeObject(myClass, settings);

这样序列化出来的结果就是你期望的格式了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:18:09