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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:15:22