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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:06:05