Newtonsoft JSON序列化小写驼峰转换失效问题求助
问题分析与解决方案
你的问题核心是Newtonsoft.Json的序列化配置未生效,可能由属性优先级冲突、全局配置覆盖或对象类型不匹配等原因导致,以下是针对性的解决思路和方案:
一、先排查基础问题
- 确认序列化对象类型:确保你传入
JsonConvert.SerializeObject的data确实是BookingJsonModel(或其派生类)的实例,而非其他未配置的类型。 - 检查Newtonsoft.Json版本:更新到最新稳定版(如13.x),旧版本可能存在ContractResolver与JsonProperty属性兼容的bug。
- 排查全局配置干扰:如果项目中设置了
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
相关产品推荐
相关产品推荐

