如何控制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
相关产品推荐
相关产品推荐

