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

如何控制Text.Json.JsonSerializer序列化实现泛型集合接口的对象

解决System.Text.Json将实现IEnumerable的类当作集合序列化的问题

当类实现IEnumerable<T>接口时,System.Text.Json默认会优先将其作为集合处理,序列化枚举的元素而非对象自身的属性。针对你的场景,有以下几种无需移除接口的解决方案:

1. 自定义JsonConverter(推荐)

编写针对MyClass的转换器,强制序列化对象的属性而非枚举元素:

public class MyClassConverter : JsonConverter<MyClass>
{
    // 实现反序列化逻辑
    public override MyClass Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var jsonElement = JsonSerializer.Deserialize<JsonElement>(ref reader, options);
        var myClass = new MyClass();
        
        if (jsonElement.TryGetProperty("Entries", out var entriesElement))
        {
            myClass.Entries = JsonSerializer.Deserialize<List<MyObj>>(entriesElement, options);
        }
        
        return myClass;
    }

    // 实现序列化逻辑,只处理MyClass的属性
    public override void Write(Utf8JsonWriter writer, MyClass value, JsonSerializerOptions options)
    {
        JsonSerializer.Serialize(writer, new { value.Entries }, options);
    }
}

使用时将转换器添加到序列化选项中:

var options = new JsonSerializerOptions();
options.Converters.Add(new MyClassConverter());
var json = JsonSerializer.Serialize(yourMyClassInstance, options);

这种方式完全可控,适合需要自定义序列化逻辑的场景。

2. 显式将对象转为object类型尝试序列化

简单但可能存在局限性的方法:

var json = JsonSerializer.Serialize((object)yourMyClassInstance);

注意:如果类型的集合特性被JsonSerializer的内部逻辑优先识别,这种方法可能不生效,仅适合简单场景测试。

3. 利用.NET 6+的源生成配置

在程序集级别配置JsonSerializer的行为,结合转换器实现精准控制:

[JsonSerializable(typeof(MyClass))]
[JsonSerializable(typeof(List<MyObj>))]
public partial class MyJsonContext : JsonSerializerContext
{
    public override JsonSerializerOptions GetOptions()
    {
        var options = base.GetOptions();
        options.Converters.Add(new MyClassConverter());
        return options;
    }
}

使用源生成上下文序列化:

var json = JsonSerializer.Serialize(yourMyClassInstance, MyJsonContext.Default.MyClass);

这种方式适合大型项目,能提升序列化性能,同时统一配置序列化规则。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:42:48