为什么JsonConvert.DeserializeObject会忽略JsonPropertyName特性?
反序列化属性为空问题修复方案
核心原因
你给ExternalMatchId属性标注的[JsonPropertyName("id")]是 System.Text.Json 库 的专属序列化特性,而你反序列化调用的JsonConvert.DeserializeObject属于 Newtonsoft.Json(Json.NET)库,两个库的序列化特性互不兼容,因此反序列化时无法将JSON结构中的id字段映射到ExternalMatchId属性,最终得到null值。
可选修复方案
方案1:替换为Newtonsoft.Json支持的特性
将MatchData类中的[JsonPropertyName("id")]替换为Newtonsoft.Json的[JsonProperty("id")]特性即可,修改前需先引入对应命名空间using Newtonsoft.Json;。
修改后的类代码示例:
[BsonCollection("matches")] public class MatchData : Document { [JsonProperty("id")] public string ExternalMatchId { get; set; } // 其余属性定义 }
方案2:统一使用System.Text.Json做反序列化
如果不想依赖Newtonsoft.Json的特性,可直接将手动反序列化的方法替换为System.Text.Json的实现:
var saveData = JsonSerializer.Deserialize<MatchData>(data.ToString());
优化方案
无需用dynamic类型接收请求参数,可直接将控制器方法的入参类型改为MatchData,ASP.NET Core会自动完成请求体的反序列化,省去手动处理步骤,代码更简洁也更不易出错:
[HttpPost("end")] public ActionResult RoundEnd([FromBody] MatchData saveData) { // 直接使用saveData执行业务逻辑即可 // 其余代码 }
采用该方案时只要保证你使用的序列化特性和项目配置的全局JSON序列化器匹配即可。
内容的提问来源于stack exchange,提问作者hoozr
相关产品推荐
相关产品推荐

