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

如何将Object类型属性反序列化为其原始自定义类型?

问题描述

我定义了如下类:

public class MyClass
{
    public int Counter { get; set; }
    public string UnderlyingItemString { get; set; }
    public object UnderlyingItem { get; set; }
}

其中UnderlyingItem属性可以是不同的类型,我已将UnderlyingItem的类型名称存储在UnderlyingItemString中,如何将该属性反序列化为它的原始类型?

目前我使用以下代码进行反序列化,但得到的UnderlyingItem是JObject类型,我需要它成为我创建的自定义类之一:

JsonConvert.DeserializeObject<MyClass>(myJSON);
解决方法

Json.NET默认无法识别object类型对应的具体类,因此会用JObject存储数据。你可以通过自定义Json转换器,根据UnderlyingItemString指定的类型完成精准反序列化,具体步骤如下:

1. 实现自定义Json转换器

创建继承自JsonConverter<MyClass>的转换器,读取JSON时先提取UnderlyingItemString的值,再用该类型反序列化UnderlyingItem:

public class MyClassConverter : JsonConverter<MyClass>
{
    public override MyClass ReadJson(JsonReader reader, Type objectType, MyClass existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var jo = JObject.Load(reader);
        var myClass = new MyClass();

        // 反序列化已知类型属性
        myClass.Counter = (int)jo["Counter"];
        myClass.UnderlyingItemString = (string)jo["UnderlyingItemString"];

        // 通过类型名称获取具体类型
        Type itemType = Type.GetType(myClass.UnderlyingItemString);
        if (itemType != null)
        {
            // 将UnderlyingItem反序列化为指定类型
            myClass.UnderlyingItem = jo["UnderlyingItem"].ToObject(itemType, serializer);
        }

        return myClass;
    }

    public override void WriteJson(JsonWriter writer, MyClass value, JsonSerializer serializer)
    {
        // 序列化时沿用默认逻辑即可
        serializer.Serialize(writer, value);
    }
}

2. 使用转换器完成反序列化

调用JsonConvert.DeserializeObject时传入自定义转换器:

var settings = new JsonSerializerSettings();
settings.Converters.Add(new MyClassConverter());

MyClass result = JsonConvert.DeserializeObject<MyClass>(myJSON, settings);

注意事项

  • Type.GetType需要完整的类型标识,包括命名空间,例如"YourNamespace.YourCustomClass";如果类型在外部程序集中,还需添加程序集名称,格式为"YourNamespace.YourCustomClass, YourAssemblyName"。
  • 如果UnderlyingItemString对应的类型不存在,itemType会返回null,可根据业务需求添加异常抛出或默认值赋值等处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:45:28