Newtonsoft.Json如何配置优先用JsonProperty 无特性默认驼峰命名
问题场景
定义如下带[JsonProperty]特性的实体类:
public sealed class CRMUser { /// The display name. /// </value> [JsonProperty("name")] public string DisplayName { get; set; } [JsonProperty("email")] public string EmailAddress { get; set; } [JsonProperty("phone")] public string PhoneNumber { get; set; } }
在控制器中通过如下代码返回JSON结果:
return Json(crmUser);
默认序列化逻辑会忽略[JsonProperty]特性,自动将属性名转为驼峰格式输出。
为了让[JsonProperty]特性生效,添加了如下配置:
services.AddControllers() .AddNewtonsoftJson(options => { // this allows us to use the JsonProperty attribute when returning Json in an action options.SerializerSettings.ContractResolver = new DefaultContractResolver(); // this resolver is from newtonsoft.json });
该配置生效后,标注了[JsonProperty]的属性可以按指定名称正常输出,但所有未标注特性的类属性不再默认转为驼峰格式。
需要实现的序列化规则:
- 属性标注
[JsonProperty]特性时,优先使用特性指定的名称输出 - 属性未标注
[JsonProperty]特性时,回退为默认驼峰命名规则输出
解决方案
问题根源是DefaultContractResolver默认保留属性的原始帕斯卡命名,不会自动做驼峰转换。直接将契约解析器替换为Newtonsoft.Json内置的CamelCasePropertyNamesContractResolver即可满足需求,修改后的配置如下:
services.AddControllers() .AddNewtonsoftJson(options => { // 优先读取JsonProperty特性指定的属性名,未标注时自动转驼峰 options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); });
规则说明
CamelCasePropertyNamesContractResolver继承自DefaultContractResolver,内置的命名解析逻辑天然符合需求:
- 若属性显式通过
[JsonProperty("指定名称")]设置了属性名,序列化时直接使用配置的名称,不做额外转换 - 若属性未标注
[JsonProperty]特性、或标注特性但未指定属性名,自动将C#类的帕斯卡命名(首字母大写)属性转为驼峰格式(首字母小写)输出
验证示例,对于如下类:
public class DemoModel { [JsonProperty("user_id")] public int UserId { get; set; } public string UserNickName { get; set; } public DateTime RegisterTime { get; set; } }
序列化输出结果为:
{ "user_id": 123, "userNickName": "test", "registerTime": "2024-01-01T00:00:00" }
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

