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

