You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:33:14