如何让System.Text.Json将实现IEnumerable的类序列化为对象
解决System.Text.Json将IEnumerable子类按对象序列化的问题
问题原因
System.Text.Json序列化器默认会把实现IEnumerable<T>的类型当作集合/数组处理,仅序列化枚举得到的元素,忽略类的其他属性(如Group、Count、Items),这就是你遇到的核心问题。
解决方案
方案1:使用[JsonObject]特性强制按对象序列化
给ObjectList<T>类添加[JsonObject]特性(需.NET 6及以上版本支持),直接告知序列化器将该类当作普通对象处理,而非集合。
修改后的类代码:
using System.Text.Json.Serialization; [JsonObject] public class ObjectList<T> : IEnumerable<T> where T : class { public ObjectList() { this.Items = new List<T>(); } public string Group { get; set; } public int Count { get => this.Items.Count; set { } } public List<T> Items { get; set; } public IEnumerator<T> GetEnumerator() { return this.Items.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return this.Items.GetEnumerator(); } } public class ItemList : ObjectList<ListItem> { } public class ListItem { public string Name { get; set; } }
方案2:通过JsonSerializerOptions配置自定义转换器
如果无法修改类的特性,可以添加自定义转换器,强制将ObjectList<T>按对象序列化。
首先定义转换器:
public class ObjectListConverter<T> : JsonConverter<ObjectList<T>> where T : class { public override ObjectList<T> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 按需实现反序列化逻辑,此处直接调用默认反序列化 return JsonSerializer.Deserialize<ObjectList<T>>(ref reader, options); } public override void Write(Utf8JsonWriter writer, ObjectList<T> value, JsonSerializerOptions options) { // 将实例当作普通对象序列化所有属性 JsonSerializer.Serialize(writer, (object)value, options); } }
然后在序列化时配置选项:
var options = new JsonSerializerOptions { Converters = { new ObjectListConverter<ListItem>() }, WriteIndented = true // 可选:格式化JSON输出 }; var itemList = new ItemList { Group = "TestGroup", Items = new List<ListItem> { new ListItem { Name = "Item1" }, new ListItem { Name = "Item2" } } }; string json = JsonSerializer.Serialize(itemList, options);
序列化结果示例
配置完成后,序列化会输出包含所有属性的JSON对象:
{ "Group": "TestGroup", "Count": 2, "Items": [ { "Name": "Item1" }, { "Name": "Item2" } ] }
内容的提问来源于stack exchange,提问作者Khamis Abuelkomboz
相关产品推荐
相关产品推荐

