如何将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
相关产品推荐
相关产品推荐

