JSON序列化后字段键变小写致API请求失败问题排查
解决JSON序列化后键名变小写导致API请求失败的问题
嘿,我之前也踩过这个一模一样的坑!问题根源十有八九是你混用了不同的JSON序列化库,导致你加的[JsonProperty]特性根本没生效。
问题拆解
你在DTO里用的[JsonProperty]是Newtonsoft.Json(也就是Json.NET)的特性,但如果调用API前的序列化代码用的是.NET自带的System.Text.Json.JsonSerializer,那这个特性完全不会被识别,默认就会把键名转成驼峰(小写开头),自然就和API要求的大小写不匹配了。
两种解决办法,选一个就行:
1. 改用System.Text.Json的对应特性
把[JsonProperty]替换成System.Text.Json.Serialization命名空间下的[JsonPropertyName],代码改成这样:
using System.Text.Json.Serialization; public class ShoppingCartDTO { [JsonPropertyName("Userid")] public string Userid { get; set; } [JsonPropertyName("Msgv1")] public string Msgv1 { get; set; } [JsonPropertyName("Data")] public string Data{ get; set; } }
这样用JsonSerializer.Serialize()序列化时,就会严格按照你指定的键名输出了。
2. 坚持用Newtonsoft.Json序列化
如果不想换特性,那就要确保序列化时用Newtonsoft的方法,而不是System.Text.Json的:
- 首先确认项目里已经安装了Newtonsoft.Json NuGet包
- 序列化代码改成:
var json = JsonConvert.SerializeObject(yourShoppingCartDto);
这样[JsonProperty]特性就能正常工作,键名会保持你指定的大小写。
额外排查点
如果上面的方法还没解决,检查下有没有全局配置强制修改命名规则:
- 比如用System.Text.Json时,有没有设置
JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase?不过放心,[JsonPropertyName]特性的优先级比全局配置高,只要加了特性就会覆盖全局规则。 - 用Newtonsoft的话,有没有设置
JsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver()?同样,[JsonProperty]特性会覆盖这个全局配置。
内容的提问来源于stack exchange,提问作者vamsi
相关产品推荐
相关产品推荐

