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

.NET 6使用System.Text.Json序列化Order对象返回空JSON问题

System.Text.Json序列化自定义类返回空JSON对象的解决办法

在Windows 10 + .NET 6环境下,使用内置的System.Text.Json序列化器序列化自定义Order类实例时,结果始终是空JSON对象"{}"。

待序列化的Order类代码

using System;
using System.Text.Json.Serialization;

[Serializable]
public class Order
{
    [JsonPropertyName("contractornumber")]
    public readonly uint contractorNumber;
    [JsonPropertyName("contractorname")]
    public readonly string contractorName;
    [JsonPropertyName("durationofcontract")]
    public readonly TimeSpan durationOfContract;
    [JsonPropertyName("ordernumber")]
    public readonly uint orderNumber;
    [JsonPropertyName("iban")]
    public readonly string IBAN;

    public Order(uint contractorNumber, string contractorName, TimeSpan durationOfContract, uint orderNumber, string IBAN)
    {
        this.contractorNumber = contractorNumber;
        this.contractorName = contractorName;
        //this.durationOfContract = durationOfContract;   
        this.orderNumber = orderNumber;
        this.IBAN = IBAN;
    }

    public Order() { }
}

序列化代码

var order = new Order(89745, "F", DateTime.Now.TimeOfDay, 84537, "FU");
var k = JsonSerializer.Serialize(order);
Console.WriteLine(k);

问题原因与解决办法

System.Text.Json的默认行为是只序列化公共属性,而你的Order类中使用的是公共字段(即使是readonly修饰的),所以默认不会被序列化。以下是三种可行的解决方式:

1. 将字段改为只读属性(推荐方案)

这是符合.NET编码规范的做法,把readonly字段替换为带有getter的属性:

[Serializable]
public class Order
{
    [JsonPropertyName("contractornumber")]
    public uint ContractorNumber { get; }
    [JsonPropertyName("contractorname")]
    public string ContractorName { get; }
    [JsonPropertyName("durationofcontract")]
    public TimeSpan DurationOfContract { get; }
    [JsonPropertyName("ordernumber")]
    public uint OrderNumber { get; }
    [JsonPropertyName("iban")]
    public string IBAN { get; }

    public Order(uint contractorNumber, string contractorName, TimeSpan durationOfContract, uint orderNumber, string IBAN)
    {
        ContractorNumber = contractorNumber;
        ContractorName = contractorName;
        DurationOfContract = durationOfContract;
        OrderNumber = orderNumber;
        IBAN = IBAN;
    }

    public Order() { }
}

2. 序列化时配置选项包含字段

在调用Serialize方法时,传入配置了IncludeFields = true的JsonSerializerOptions:

var options = new JsonSerializerOptions
{
    IncludeFields = true
};
var k = JsonSerializer.Serialize(order, options);

3. 给字段添加[JsonInclude]特性

给需要序列化的readonly字段添加[JsonInclude]特性,明确告诉序列化器要包含这些字段:

[Serializable]
public class Order
{
    [JsonInclude]
    [JsonPropertyName("contractornumber")]
    public readonly uint contractorNumber;
    [JsonInclude]
    [JsonPropertyName("contractorname")]
    public readonly string contractorName;
    [JsonInclude]
    [JsonPropertyName("durationofcontract")]
    public readonly TimeSpan durationOfContract;
    [JsonInclude]
    [JsonPropertyName("ordernumber")]
    public readonly uint orderNumber;
    [JsonInclude]
    [JsonPropertyName("iban")]
    public readonly string IBAN;

    // 构造函数部分不变
}

注意:原代码中durationOfContract字段的赋值被注释掉了,即使解决了序列化问题,这个字段的值也会是默认的TimeSpan.Zero,记得取消注释赋值代码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:55:22