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

Newtonsoft JSON序列化小写驼峰转换失效问题求助

问题分析与解决方案

你的问题核心是Newtonsoft.Json的序列化配置未生效,可能由属性优先级冲突、全局配置覆盖或对象类型不匹配等原因导致,以下是针对性的解决思路和方案:


一、先排查基础问题

  1. 确认序列化对象类型:确保你传入JsonConvert.SerializeObject的data确实是BookingJsonModel(或其派生类)的实例,而非其他未配置的类型。
  2. 检查Newtonsoft.Json版本:更新到最新稳定版(如13.x),旧版本可能存在ContractResolver与JsonProperty属性兼容的bug。
  3. 排查全局配置干扰:如果项目中设置了JsonConvert.DefaultSettings全局序列化规则,会覆盖局部的JsonSerializerSettings,需确保局部配置明确覆盖全局规则。

二、分场景解决方案

场景1:所有属性自动转小写驼峰(无需手动指定)

移除类中所有[JsonProperty]属性,因为手动指定名称会优先于ContractResolver的自动转换逻辑:

// 移除JsonProperty和JsonObject(Title)(Title仅影响JSON Schema,不影响属性名)
public class BookingJsonModel
{
    public Guid Id { get; set; }
    public string Reference { get; set; } = null!;
    // 其他属性...
}

// 序列化代码保持不变
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();

string body = JsonConvert.SerializeObject(data, settings);

此时序列化结果会自动将Id转为id,Reference转为reference。

场景2:部分属性自定义名称,其余自动转驼峰

如果需要给特定属性指定自定义名称,保留该属性的[JsonProperty]即可,CamelCasePropertyNamesContractResolver会尊重手动指定的名称,同时自动转换未指定的属性:

public class BookingJsonModel
{
    // 手动指定名称,会直接使用"booking_id"
    [JsonProperty("booking_id")]
    public Guid Id { get; set; }
    // 未手动指定,自动转为"reference"
    public string Reference { get; set; } = null!;
    // 其他属性...
}

// 序列化代码不变
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();

string body = JsonConvert.SerializeObject(data, settings);

场景3:自定义ContractResolver兼容手动指定与自动驼峰

如果遇到手动指定的[JsonProperty]仍未生效的极端情况,可以自定义ContractResolver,确保逻辑优先级正确:

public class CustomCamelCaseResolver : CamelCasePropertyNamesContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        // 仅当属性未手动指定JsonProperty时,才应用驼峰转换
        if (member.GetCustomAttribute<JsonPropertyAttribute>() == null)
        {
            property.PropertyName = char.ToLowerInvariant(property.PropertyName[0]) + property.PropertyName.Substring(1);
        }
        return property;
    }
}

// 使用自定义Resolver
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new CustomCamelCaseResolver();

string body = JsonConvert.SerializeObject(data, settings);

三、验证测试

创建极简测试代码,排除其他业务逻辑干扰,确认配置是否生效:

public class TestModel
{
    public Guid Id { get; set; } = Guid.NewGuid();
    public string Reference { get; set; } = "TEST_123";
}

var testData = new TestModel();
var settings = new JsonSerializerSettings
{
    Formatting = Formatting.Indented,
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
string json = JsonConvert.SerializeObject(testData, settings);
Console.WriteLine(json);

预期输出:

{
  "id": "xxxx-xxxx-xxxx-xxxx",
  "reference": "TEST_123"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:11:13