JsonConvert.SerializeObject转子类为父类后仍返回子类属性如何解决
问题原因
Newtonsoft.Json默认采用对象的运行时实际类型进行序列化,你将ChildClass实例强转为ParentClass只是更改了引用的类型声明,并没有改变对象本身的实际类型,因此序列化时依然会扫描ChildClass的所有公共属性输出。
解决方案
不需要修改实体类的代码,有两种常用实现方式:
方式1:使用指定序列化类型的重载(最简单)
SerializeObject提供了显式指定序列化类型的重载,直接传入typeof(ParentClass)即可让序列化器按照父类的结构来输出属性:
var jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(data, typeof(ParentClass), null);
输出结果为:
{"P1":"p1"}
方式2:自定义ContractResolver(适合灵活过滤场景)
如果需要更通用的属性过滤逻辑(比如按自定义规则筛选属性,不是固定对应某个基类),可以自定义契约解析器,不需要侵入实体类代码:
using Newtonsoft.Json; using Newtonsoft.Json.Serialization; public class SpecifiedTypeContractResolver : DefaultContractResolver { private readonly Type _serializeAsType; public SpecifiedTypeContractResolver(Type serializeAsType) { _serializeAsType = serializeAsType; } protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { // 仅返回指定类型定义的属性 return base.CreateProperties(_serializeAsType, memberSerialization); } }
使用方式:
var settings = new JsonSerializerSettings { ContractResolver = new SpecifiedTypeContractResolver(typeof(ParentClass)) }; var jsonData = JsonConvert.SerializeObject(data, settings);
以上两种方案都不会影响其他业务场景的序列化逻辑,满足你不需要加JsonIgnore特性的要求。
内容的提问来源于stack exchange,提问作者Sadjad Bahmanpour
相关产品推荐
相关产品推荐

