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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:18:19