将泛型Object类型转换为特定自定义对象时的类型转换错误问题
问题:嵌套JSON中JObject转自定义对象失败
我有一个深层嵌套的JSON结构,其中包含泛型object类型的字段,需要将其转换为自定义对象类型做后续处理。简化后的JSON结构如下:
{ "main": [ { "list": [ { "sublist": [ { "items": [ { // 参数设置、静态字符串等固定结构 "Generic Object": {...} // 根据上方内容需转为ObjectType1对象 }, { // 参数设置、静态字符串等固定结构 "Generic Object": {...} // 根据上方内容需转为ObjectType2对象 } ] } ] } ] } ] }
初始反序列化时,我将"Generic Object"字段定义为Object类型,但尝试直接强转成目标类型时:
var customObj = (TypecastObjectType1)<locationOfObject>.VariableObject;
抛出错误:
Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'TypecastObjectType1'.
我确认过JSON结构和自定义类的get/set结构完全匹配,但强转失败。我的需求是仅在使用该部分内容时再进行类型转换,以便针对不同操作类型处理特定对象。
解决方案
直接强转失败的核心原因是:Newtonsoft.Json在反序列化object类型字段时,会自动将JSON对象解析为JObject实例,而非目标自定义类型,因此不能直接强制类型转换,需使用Newtonsoft提供的专属转换方法:
方法1:用JObject.ToObject<T>()转换
先将VariableObject转为JObject,再调用ToObject<T>方法生成目标类型实例:
var jObj = <locationOfObject>.VariableObject as JObject; if (jObj != null) { var targetObj = jObj.ToObject<TypecastObjectType1>(); // 对targetObj进行后续业务处理 }
方法2:反序列化阶段直接指定类型(适用于类型提前确定的场景)
如果在反序列化前就能明确"Generic Object"的目标类型,可以直接把自定义类中的对应字段定义为目标类型,而非object:
// 自定义Item类示例 public class Item { // 其他固定参数字段 public TypecastObjectType1 GenericObject { get; set; } }
但如果类型是动态的(根据上方参数决定),此方法不适用,优先选择方法1。
方法3:用JsonConvert.DeserializeObject<T>()转换
若能获取到"Generic Object"对应的JSON字符串,也可以通过序列化再反序列化的方式转换:
var jsonStr = (<locationOfObject>.VariableObject as JObject)?.ToString(); if (!string.IsNullOrEmpty(jsonStr)) { var targetObj = JsonConvert.DeserializeObject<TypecastObjectType1>(jsonStr); // 后续处理逻辑 }
内容的提问来源于stack exchange,提问作者Vlad SD
相关产品推荐
相关产品推荐

