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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 09:07:15