.NET复杂Dto序列化JSON时OldValue/NewValue值丢失问题
问题解决:NewtonSoft.Json序列化多类型Dto仅显示ValueKind的问题
问题情况
你定义了包含多类型字段OldValue、NewValue的ChangeBucketDto,控制器接收List<ChangeBucketDto>后,用NewtonSoft.Json序列化时,这两个字段只输出ValueKind(比如{"ValueKind": 3}),看不到实际的Dto内容。查下来是因为项目里同时用了System.Text.Json和NewtonSoft.Json,导致对象被反序列化成JsonElement类型,后续用NewtonSoft.Json序列化时只能识别到它的ValueKind属性。
解决办法:统一用NewtonSoft.Json做序列化/反序列化
1. 让ASP.NET Core控制器用NewtonSoft.Json处理请求
ASP.NET Core默认用System.Text.Json处理请求,得换成NewtonSoft.Json:
- 先装NuGet包:
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在
Program.cs(老项目是Startup.cs)里加配置:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 要是多类型Dto需要保留类型信息,就开这个配置 options.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; });
2. 全项目替换序列化工具
把所有用System.Text.Json.JsonSerializer的地方,都换成Newtonsoft.Json.JsonConvert。比如:
// 序列化List<ChangeBucketDto> var json = JsonConvert.SerializeObject(yourChangeBucketList, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }); // 反序列化也一样用JsonConvert var bucketList = JsonConvert.DeserializeObject<List<ChangeBucketDto>>(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
3. 检查Dto的字段类型
如果OldValue和NewValue是object或者自定义的多类型基类,确保它们不会被System.Text.Json转成JsonElement——只要统一用NewtonSoft.Json处理,这个问题就不会出现。
内容的提问来源于stack exchange,提问作者R K
相关产品推荐
相关产品推荐

