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

.NET Core 2.1迁移至.NET 6后object类型返回空数组问题

.NET 6中object类型属性返回空数组的原因及解决方案

核心原因

.NET 6默认采用System.Text.Json作为JSON序列化器,而.NET Core 2.1默认使用Newtonsoft.Json(Json.NET),二者对object类型属性的序列化逻辑存在本质差异:

  • Newtonsoft.Json会根据object属性的实际运行时类型进行序列化,能正确识别并输出对应的数据结构(比如字符串、数字、自定义对象等)。
  • System.Text.Json在处理未指定具体类型的object属性时,默认会将其视为JsonElement处理,若无法正确推断实际类型,会错误地将原本非集合类型的数据序列化为空数组[]。这是System.Text.Json的默认序列化行为,也是导致问题的直接原因。

解决方案

1. 切换回Newtonsoft.Json(最直接的兼容方案)

在.NET 6项目中安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet包,然后在Program.cs中配置使用Newtonsoft.Json作为序列化器:

var builder = WebApplication.CreateBuilder(args);

// 添加控制器并配置使用NewtonsoftJson
builder.Services.AddControllers()
    .AddNewtonsoftJson();

var app = builder.Build();

app.MapControllers();
app.Run();

此方案能完全对齐.NET Core 2.1的序列化行为,无需修改原有业务代码即可解决问题。

2. 调整System.Text.Json的序列化配置(不切换序列化器的方案)

如果希望继续使用System.Text.Json,可以通过以下方式调整:

  • 若明确object属性的实际类型,将属性类型从object改为具体类型(比如string、int或自定义类),避免序列化时的类型推断问题。
  • 自定义JsonConverter来处理object类型的序列化,手动识别实际类型并进行正确序列化。示例如下:
public class ObjectConverter : JsonConverter<object>
{
    public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return reader.TokenType switch
        {
            JsonTokenType.String => reader.GetString(),
            JsonTokenType.Number => reader.GetInt32(),
            JsonTokenType.True => true,
            JsonTokenType.False => false,
            JsonTokenType.StartObject => JsonSerializer.Deserialize<JsonElement>(ref reader, options),
            JsonTokenType.StartArray => JsonSerializer.Deserialize<JsonElement[]>(ref reader, options),
            _ => JsonSerializer.Deserialize<JsonElement>(ref reader, options)
        };
    }

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
    {
        JsonSerializer.Serialize(writer, value, value.GetType(), options);
    }
}

然后在Program.cs中注册该转换器:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new ObjectConverter());
    });

验证

在你的复现项目中,按照上述任一方案调整后,重新运行接口,Foo、Bar属性将正确返回原本的非空数据,而非空数组。

内容的提问来源于stack exchange,提问作者Mohamad Hammash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:31:07