Newtonsoft Json序列化:CamelCaseResolver忽略JsonProperty全大写名称问题
问题原因&解决方案
嘿,这个问题我之前排查过,核心点在于CamelCasePropertyNameContractResolver的默认行为:它依赖的CamelCaseNamingStrategy有个默认开启的OverrideSpecifiedNames属性,当这个值为true时,哪怕你用[JsonProperty]手动指定了属性名称,解析器依然会用驼峰规则去覆盖这个自定义名称。
为什么Foo和CamelCaseProperty看起来正常?其实是巧合:
Foo没加特性,本来就会被解析器转成驼峰foo,符合预期;CamelCaseProperty如果指定的名称本身就是驼峰风格,解析器转完和你指定的一致,所以看起来没问题;- 但
Bar你指定的是全大写BAR,解析器会强制把它转成驼峰bar,就出现了不符合预期的情况。
解决办法:自定义驼峰解析器
我们只需要修改CamelCaseNamingStrategy的OverrideSpecifiedNames属性为false,让解析器尊重我们通过[JsonProperty]指定的名称,同时保留全局驼峰规则。
1. 自定义解析器类
public class RespectingCamelCaseResolver : CamelCasePropertyNameContractResolver { public RespectingCamelCaseResolver() { // 关闭对手动指定名称的覆盖,保留JsonProperty特性的设置 NamingStrategy.OverrideSpecifiedNames = false; } }
2. 配置序列化器使用自定义解析器
无论是普通序列化还是ASP.NET中配置全局序列化,替换成这个自定义解析器就行:
// 普通序列化场景示例 var settings = new JsonSerializerSettings { ContractResolver = new RespectingCamelCaseResolver(), Formatting = Formatting.Indented // 可选,格式化输出方便查看 }; var testObj = new YourEntity { Foo = "testFoo", Bar = "testBar", CamelCaseProperty = "testCamel" }; string json = JsonConvert.SerializeObject(testObj, settings);
3. 实体类示例(和你原来的写法一致即可)
public class YourEntity { // 无特性,自动转驼峰"foo" public string Foo { get; set; } // 指定全大写,现在会正确序列化为"BAR" [JsonProperty("BAR")] public string Bar { get; set; } // 指定驼峰名称,正常保留 [JsonProperty("camelCaseProperty")] public string CamelCaseProperty { get; set; } }
最终序列化结果
{ "foo": "testFoo", "BAR": "testBar", "camelCaseProperty": "testCamel" }
这样就完美兼顾了全局驼峰命名和特定属性的自定义名称需求,包括全大写的场景。
内容的提问来源于stack exchange,提问作者darasd
相关产品推荐
相关产品推荐

