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

如何在.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作为序列化器:

  1. 安装对应的NuGet包:Microsoft.AspNetCore.Mvc.NewtonsoftJson
  2. 修改服务注册配置:
// .NET 6+ Program.cs
builder.Services.AddControllers()
    .AddNewtonsoftJson();

// Startup模式
services.AddControllers()
    .AddNewtonsoftJson();

切换后默认会序列化公共字段,如果需要修改键名,使用Newtonsoft.Json原生的[JsonProperty("X")]特性标注对应字段即可。


内容的提问来源于stack exchange,提问作者Ian W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:30:00