.NET Core 2.2升级到.NET 6后Newtonsoft.Json反序列化失效问题
.NET 6升级后Newtonsoft反序列化失效的解决方法
方法一:直接操作JsonElement提取数据
.NET 6中动态参数默认是System.Text.Json.JsonElement,需通过其API获取目标数据:
- 强转dynamic参数为JsonElement:
var jsonElement = (JsonElement)mapping; - 获取"data"节点对应的JsonElement:
var dataElement = jsonElement.GetProperty("data"); - 将节点转为原始JSON字符串后用Newtonsoft反序列化:
var jsonString = dataElement.GetRawText(); var mappingList = JsonConvert.DeserializeObject<List<CustomBranchMappingDto>>(jsonString);
方法二:全局配置ASP.NET Core使用Newtonsoft.Json
若想恢复.NET Core 2.2的参数处理逻辑,让动态参数回到Newtonsoft的JObject:
- 安装NuGet包:
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在Program.cs中修改服务配置:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 可根据需求配置序列化规则,比如保留默认属性命名 options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); });
配置完成后,原有代码JsonConvert.DeserializeObject<List<CustomBranchMappingDto>>(mapping.data.ToString())即可正常运行。
方法三:修复Newtonsoft反序列化空值/0值问题
若转JSON字符串后反序列化出现属性全为空或0,通常是属性命名不匹配导致:
- 给Dto类的属性添加Newtonsoft的JsonProperty特性,指定JSON键名:
public class CustomBranchMappingDto { [JsonProperty("ours")] public int Ours { get; set; } [JsonProperty("theirs")] public string Theirs { get; set; } [JsonProperty("companyId")] public int CompanyId { get; set; } }
- 或者全局配置Newtonsoft自动适配驼峰命名:
var serializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var mappingList = JsonConvert.DeserializeObject<List<CustomBranchMappingDto>>(jsonString, serializerSettings);
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

