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

在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没有任何成员,所以输出{}。

解决办法

要让序列化器识别实例的真实类型,有几种实用方案:

  1. 序列化时指定实例的实际类型
Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(myLogin, myLogin.GetType()));
  1. 配置序列化选项支持多态(.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));
  1. 给接口添加多态特性(.NET 7+推荐)
    直接在接口上标记派生类型,序列化时自动识别:
using System.Text.Json.Serialization;

[JsonDerivedType(typeof(TestLogin))]
public interface ITest;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:55:16