.NET Core 5控制器返回空对象数组的原因及错误排查
.NET Core 5控制器返回空对象数组的原因及解决
核心原因
.NET Core 5默认使用System.Text.Json作为API的JSON序列化器,而你手动调用的JsonConvert.SerializeObject属于Newtonsoft.Json(Json.NET),两者的序列化规则存在差异,导致同一对象在两种方式下输出结果不同。
具体可能的错误点
- SalesPersonDto属性配置不符合System.Text.Json要求:System.Text.Json默认只序列化public且带有公共getter的属性。如果你的
SalesPersonDto中Id、Name、PhoneNo、Type这些属性是private/internal,或者只有setter没有getter,System.Text.Json会直接忽略这些属性,最终输出空对象数组。而Newtonsoft.Json的序列化规则更宽松,在这类场景下仍能正确序列化属性。 - 特性兼容性问题:如果给Dto属性添加了Newtonsoft专属的特性(如
[JsonProperty]),但未配置对应System.Text.Json的特性(如[JsonPropertyName]),System.Text.Json无法识别这些特性,会导致属性不被序列化。
解决方法
修正SalesPersonDto的属性定义:确保需要序列化的属性都是public且带有公共getter:
public class SalesPersonDto { public string Id { get; set; } public string Name { get; set; } public string PhoneNo { get; set; } public string Type { get; set; } }配置System.Text.Json序列化规则:如果想继续使用默认的System.Text.Json,可以在
Startup.cs中调整序列化选项,匹配需求:services.AddControllers() .AddJsonOptions(options => { // 关闭默认驼峰命名,保持属性原命名风格 options.JsonSerializerOptions.PropertyNamingPolicy = null; // 如需序列化字段(非属性),可开启此选项(不推荐) // options.JsonSerializerOptions.IncludeFields = true; });全局替换为Newtonsoft.Json:如果习惯使用Newtonsoft.Json的规则,可以将其设为API默认序列化器,无需每次手动调用
JsonConvert:services.AddControllers() .AddNewtonsoftJson();
内容的提问来源于stack exchange,提问作者Vala Khosravi
相关产品推荐
相关产品推荐

