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

C#使用JsonConvert反序列化包含继承类对象的实现方案

解决方案

你遇到的是Newtonsoft.Json默认反序列化抽象基类集合时,不会自动识别子类类型的问题,有两种简洁优雅的实现方式:

方案1:自定义子类识别JsonConverter(无侵入性,最灵活)

首先实现自定义的基类转换器,根据JSON字段特征自动匹配对应的子类类型:

public class BaseClassConverter : JsonConverter<BaseClass>
{
    public override BaseClass ReadJson(JsonReader reader, Type objectType, BaseClass existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var jObject = JObject.Load(reader);
        // 根据JSON包含的独有字段判断子类类型,也可以根据name字段值匹配
        if (jObject.ContainsKey("number") || jObject.ContainsKey("mytext"))
        {
            return jObject.ToObject<FlavourOne>(serializer);
        }
        if (jObject.ContainsKey("yourtext"))
        {
            return jObject.ToObject<FlavourTwo>(serializer);
        }
        throw new NotSupportedException("不支持的BaseClass子类类型");
    }

    public override void WriteJson(JsonWriter writer, BaseClass value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

使用时在反序列化方法中传入转换器即可:

var responseObject = JsonConvert.DeserializeObject<JsonResult>(rawJsonString, new BaseClassConverter());

该方案不需要修改原有业务类定义,判断逻辑可以根据需求灵活调整。

方案2:基类标注JsonConverter特性(侵入式,调用更简洁)

如果不需要频繁调整继承体系的判断逻辑,可以直接给基类加特性绑定转换器,不需要每次反序列化都传参:

[JsonConverter(typeof(BaseClassConverter))]
public abstract class BaseClass
{
    [JsonProperty("name")]
    public string Name { get; set; }
}

绑定后直接调用原有的反序列化代码即可正常工作:

var responseObject = JsonConvert.DeserializeObject<JsonResult>(rawJsonString);

额外说明

不推荐使用TypeNameHandling.All配置,该方案不仅存在反序列化安全风险,还要求JSON中包含额外的$type类型标识字段,不符合你当前的JSON格式要求。

内容的提问来源于stack exchange,提问作者Navorski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 12:39:05