ASP.NET 5中Newtonsoft.Json多态序列化仅返回$type属性问题咨询
问题原因
你遇到的空对象序列化问题核心是[DataContract]特性的序列化规则导致的:
Newtonsoft.Json对于标注了[DataContract]的类型,默认只会序列化显式标记了[DataMember]特性的成员,你当前的代码里仅给DerivedClass加了[DataContract],但自身的List2、List3以及基类BaseClass的所有属性都没有加[DataMember],所以序列化后只会输出$type元数据,没有实际属性内容。
之前功能正常应该是移动类前该类没有标注[DataContract],或者之前配套的[DataMember]标注在移动代码过程中丢失了。
解决方法
根据你的业务需求二选一即可:
方案1:移除数据契约特性(最简单)
如果不需要用到[DataContract]提供的自定义序列化名称、WCF兼容等能力,直接删掉DerivedClass上的[DataContract(Name = "BuildingValue")]特性即可,Newtonsoft.Json会默认序列化所有公共属性,恢复正常输出。
方案2:补充完整数据契约标注
如果需要保留[DataContract],需要给所有要序列化的属性加上[DataMember],同时基类也要补充[DataContract]标注,修改后的代码如下:
[DataContract(Name = "BuildingValue")] public class DerivedClass : BaseClass { [DataMember] public List<AnotherClass> List2 { get; set; } = new(); [DataMember] public List<AnotherClass> List3 { get; set; } = new(); } [DataContract] public abstract class BaseClass { [DataMember] public Guid Prop1 { get; set; } [DataMember] public uint Prop2 { get; set; } [DataMember] public List<AnotherClass> List1 { get; set; } = new(); }
额外校验点
如果调整后依然有问题,排查两个常见场景:
- 移动类时是否不小心把类的访问修饰符改成了非
public,非公共类默认不会被序列化属性 - 你当前返回的
$type只有类名没有命名空间、程序集信息,如果后续需要反序列化该JSON,需要补充配置SerializerSettings.TypeNameAssemblyFormatHandling,避免反序列化时找不到对应类型。
内容的提问来源于stack exchange,提问作者DirtyNative
相关产品推荐
相关产品推荐

