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

ASP.NET Core:JsonConvert.DeserializeObject不遵循CamelCasePropertyNamesContractResolver

问题分析与修复方案

你的问题根源在于反序列化时没有使用强类型模型,导致返回的是JObject/JArray这类动态JSON结构,而ASP.NET Core在序列化这些动态结构时,不会应用你在Startup中配置的CamelCasePropertyNamesContractResolver,而是直接输出它们原本的属性名。

为什么其他控制器正常?

其他控制器返回的是强类型的.NET对象(比如你定义的UserModel、OrderModel这类类),ASP.NET Core会触发全局的JSON序列化配置,自动将对象的PascalCase属性转换为camelCase输出。但你当前代码中,JsonConvert.DeserializeObject(content, settings)没有指定泛型类型,默认会把JSON字符串解析为JObject(如果是对象)或JArray(如果是数组)——这些结构本身就保留了原JSON的PascalCase属性名,返回时自然不会被转换。


修复方案

方案1:反序列化为强类型模型(推荐)

这是最规范的做法,也能完美复用你全局的序列化配置:

  1. 定义与JSON文件结构匹配的强类型模型类(属性用PascalCase命名,和JSON中的PascalCase对应):
    public class YourModel
    {
        public string UserName { get; set; }
        public int Age { get; set; }
        // 其他属性...
    }
    
  2. 使用泛型版本的DeserializeObject方法反序列化:
    var content = System.IO.File.ReadAllText(this.path);
    // 这里不需要单独指定CamelCaseResolver,因为反序列化时JSON是PascalCase,模型属性也是PascalCase,默认就能匹配
    var model = JsonConvert.DeserializeObject<YourModel>(content);
    return Ok(model);
    

这样返回时,ASP.NET Core会自动应用你在Startup中配置的CamelCasePropertyNamesContractResolver,将属性转换为camelCase输出。

方案2:手动序列化并应用配置(适合无法定义强类型的场景)

如果因为JSON结构不固定,无法定义强类型模型,可以手动使用全局配置序列化后返回:

  1. 先注入全局的JSON序列化配置(在控制器构造函数中注入IOptions<MvcJsonOptions>,注意根据你的ASP.NET Core版本调整类型:ASP.NET Core 3.0+用IOptions<JsonOptions>,如果用的是Newtonsoft.Json则还是MvcJsonOptions):
    private readonly IOptions<MvcJsonOptions> _jsonOptions;
    
    public YourController(IOptions<MvcJsonOptions> jsonOptions)
    {
        _jsonOptions = jsonOptions;
    }
    
  2. 反序列化后手动序列化并返回Content结果:
    var content = System.IO.File.ReadAllText(this.path);
    var model = JsonConvert.DeserializeObject(content); // 得到JObject/JArray
    // 使用全局配置序列化
    var camelCaseJson = JsonConvert.SerializeObject(model, _jsonOptions.Value.SerializerSettings);
    return Content(camelCaseJson, "application/json");
    

方案3:转换JObject属性为camelCase(不推荐,繁琐)

如果一定要用JObject,可以手动遍历属性并修改名称:

var jObject = JsonConvert.DeserializeObject<JObject>(content);
var camelCaseJObject = new JObject();
foreach (var prop in jObject.Properties())
{
    // 转换属性名为camelCase
    var camelCaseName = char.ToLowerInvariant(prop.Name[0]) + prop.Name.Substring(1);
    camelCaseJObject.Add(camelCaseName, prop.Value);
}
return Ok(camelCaseJObject);

这个方法只适用于简单的JSON结构,嵌套对象/数组需要递归处理,非常麻烦,所以优先推荐前两个方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:45:38