基类重写ToString方法序列化子类仅返回空JSON,如何实现统一重写
问题根因
该现象是System.Text.Json的默认序列化逻辑导致的:无泛型参数的JsonSerializer.Serialize(Object)方法会使用参数的编译时类型做序列化解析。你在基类ResponseBase中调用该方法时,this的编译时类型固定为ResponseBase,因此只会序列化基类定义的属性,子类扩展的属性不会被识别。
解决方案
修改基类的ToString实现,调用JsonSerializer.Serialize的重载方法,显式传入运行时的实际类型即可:
public class ResponseBase { public override string ToString() { // GetType()会返回当前实例运行时的真实类型(即子类类型) return JsonSerializer.Serialize(this, GetType()); } }
修改后再次运行测试代码,就能得到包含Name属性的正常JSON结果{"Name":"Test"}。
可选扩展
如果需要统一控制序列化行为(比如驼峰命名、忽略空值、循环引用处理等),可以自定义全局JsonSerializerOptions传入:
public class ResponseBase { // 全局统一序列化配置 private static readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull }; public override string ToString() { return JsonSerializer.Serialize(this, GetType(), _jsonOptions); } }
内容的提问来源于stack exchange,提问作者Pawan Nogariya
相关产品推荐
相关产品推荐

