如何在.Net Core中将struct结构体正确序列化为非空JSON返回
问题根本原因
.NET Core 及更高版本默认使用System.Text.Json作为内置序列化器,该序列化器默认仅序列化公共属性,不会序列化公共字段,你定义的MyStructure中A、B都是公共字段,因此序列化后会返回空JSON对象。
解决方法
方案1:为字段添加序列化特性(最小改动)
直接在struct的公共字段上添加[JsonInclude]显式指定需要序列化该字段,同时搭配[JsonPropertyName]指定序列化后的键名,匹配你期望的输出格式:
using System.Text.Json.Serialization; public struct MyStructure { [JsonInclude] [JsonPropertyName("X")] public double A; [JsonInclude] [JsonPropertyName("Y")] public double B; }
方案2:全局配置System.Text.Json序列化规则
如果项目中有大量类似的带公共字段的struct/类,不想逐个字段加特性,可以在服务注册时全局开启公共字段序列化:
.NET 6+ Top-level Statement 模式(Program.cs)
builder.Services.AddControllers() .AddJsonOptions(options => { // 全局开启公共字段序列化 options.JsonSerializerOptions.IncludeFields = true; });
Startup 模式
public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.IncludeFields = true; }); }
全局配置后如果需要将字段A、B序列化为X、Y,仍然需要在对应字段上添加[JsonPropertyName("X")]/[JsonPropertyName("Y")]特性。
方案3:切换回Newtonsoft.Json(兼容.NET Framework原有逻辑)
如果希望保持和.NET Framework完全一致的序列化行为,可以切换回Newtonsoft.Json作为序列化器:
- 安装对应的NuGet包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 修改服务注册配置:
// .NET 6+ Program.cs builder.Services.AddControllers() .AddNewtonsoftJson(); // Startup模式 services.AddControllers() .AddNewtonsoftJson();
切换后默认会序列化公共字段,如果需要修改键名,使用Newtonsoft.Json原生的[JsonProperty("X")]特性标注对应字段即可。
内容的提问来源于stack exchange,提问作者Ian W
相关产品推荐
相关产品推荐

