.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
相关产品推荐
相关产品推荐

