在C#中,System.Text.Json序列化接口实现类为何仅输出{}?含依赖注入场景
System.Text.Json序列化问题解答
问题1:接口依赖注入场景下序列化失效的原因
System.Text.Json默认基于编译时声明的类型执行序列化。在依赖注入场景中,如果你通过接口类型获取实例(比如ITest service = sp.GetRequiredService<ITest>()),序列化器只会处理该接口定义的成员。如果你的接口(比如示例里的ITest)没有任何属性或字段,序列化结果自然是空对象{}。
核心逻辑:序列化器认的是变量的声明类型,而非实际运行的实例类型。
问题2:提供的代码输出"{}"的原因
你贴出的代码直接运行的话,应该能正常输出包含属性的JSON。但实际输出空对象,大概率是因为你在真实场景中把TestLogin实例赋值给了ITest类型的变量,然后对这个接口变量执行序列化。
比如真实代码可能是这样:
ITest myLogin = new TestLogin { UserName = "cr@home.com", Password = "Pass123" }; Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(myLogin));
此时序列化器以ITest为处理依据,而ITest没有任何成员,所以输出{}。
解决办法
要让序列化器识别实例的真实类型,有几种实用方案:
- 序列化时指定实例的实际类型
Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(myLogin, myLogin.GetType()));
- 配置序列化选项支持多态(.NET 6+适用)
var options = new JsonSerializerOptions { TypeInfoResolver = new DefaultJsonTypeInfoResolver { Modifiers = { ti => { if (ti.Type == typeof(ITest)) { ti.PolymorphismOptions = new JsonPolymorphismOptions { DerivedTypes = { new JsonDerivedType(typeof(TestLogin)) } }; } } } } }; Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(myLogin, options));
- 给接口添加多态特性(.NET 7+推荐)
直接在接口上标记派生类型,序列化时自动识别:
using System.Text.Json.Serialization; [JsonDerivedType(typeof(TestLogin))] public interface ITest;
内容的提问来源于stack exchange,提问作者csharpforevermore
相关产品推荐
相关产品推荐

