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
相关产品推荐
相关产品推荐

