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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:24:03