为什么继承自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
相关产品推荐
相关产品推荐

