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

为什么继承自JsonSerializable的子类无法被JSON正确序列化?

为什么继承自JsonSerializable的子类无法被JSON正确序列化?

嘿,我来给你拆解这个问题的核心原因!

你写的这段代码里,问题出在JsonSerializable基类的ToJson方法上:当你调用JsonSerializer.Serialize(this)时,这里的this在编译阶段被识别为JsonSerializable类型(也就是你的抽象基类)。而System.Text.Json默认只会序列化编译时类型的成员,可你的基类里根本没有任何可序列化的属性,所以子类Cabinet的Name字段自然不会被包含在最终的JSON里,结果要么是空对象,要么完全没你想要的内容。

那怎么解决呢?给你两个实用的方案:

  • 方案一:传入运行时类型(最通用)
    修改基类的ToJson方法,把实际的运行时类型传给序列化器,这样它就会识别到子类的所有成员了:

    public string ToJson()
    {
        // GetType()会返回当前实例的实际类型(比如Cabinet)
        return JsonSerializer.Serialize(this, this.GetType());
    }
    

    这个方法最灵活,不管你后续加多少个子类,都不用修改基类代码。

  • 方案二:显式标记派生类型
    如果你能提前知道所有子类,也可以在基类上用[JsonDerivedType]属性声明派生类型,这样序列化器也能正确识别子类成员:

    [JsonDerivedType(typeof(Cabinet))]
    abstract public class JsonSerializable : IJson
    {
        public string ToJson()
        {
            return JsonSerializer.Serialize(this);
        }
    }
    

    不过这个方法有局限性,每次新增子类都得修改基类,适合子类数量固定的场景。

举个例子,用方案一修改后,你创建Cabinet实例并调用ToJson,就能得到类似{"name":"你的柜子名称"}的正确JSON了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:40:30