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:反序列化为强类型模型(推荐)
这是最规范的做法,也能完美复用你全局的序列化配置:
- 定义与JSON文件结构匹配的强类型模型类(属性用PascalCase命名,和JSON中的PascalCase对应):
public class YourModel { public string UserName { get; set; } public int Age { get; set; } // 其他属性... } - 使用泛型版本的
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结构不固定,无法定义强类型模型,可以手动使用全局配置序列化后返回:
- 先注入全局的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; } - 反序列化后手动序列化并返回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
相关产品推荐
相关产品推荐

