如何实现JsonConvert.DeserializeObject的泛型列表反序列化?
动态反序列化泛型列表解决方案
已知对象类型(Type itemType)的情况下,你可以通过以下两种方式实现动态泛型列表的反序列化:
方法一:使用非泛型重载结合泛型类型创建
直接利用JsonConvert.DeserializeObject(string, Type)重载,先通过typeof(List<>).MakeGenericType创建具体的泛型列表类型,再传入反序列化方法:
// 假设已获取到对象类型 Type itemType = ...; // 创建List<itemType>对应的Type对象 Type listType = typeof(List<>).MakeGenericType(itemType); // 执行反序列化 object listInstance = JsonConvert.DeserializeObject(jsonString, listType);
如果需要后续操作列表元素,可以将结果转为IList接口进行统一处理:
IList dynamicList = (IList)listInstance; foreach (var item in dynamicList) { // 可通过反射访问item的属性,例如获取prop1的值 object propValue = item.GetType().GetProperty("prop1")?.GetValue(item); }
方法二:反射调用泛型DeserializeObject方法
通过反射获取JsonConvert.DeserializeObject<T>的泛型方法定义,再生成对应泛型参数的方法实例并调用:
Type itemType = ...; Type genericListType = typeof(List<>).MakeGenericType(itemType); // 获取泛型方法定义 MethodInfo deserializeMethod = typeof(JsonConvert) .GetMethod("DeserializeObject", new[] { typeof(string) }) .MakeGenericMethod(genericListType); // 调用方法完成反序列化 object listInstance = deserializeMethod.Invoke(null, new object[] { jsonString });
两种方法中,方法一代码更简洁,是日常开发中的首选方案。
内容的提问来源于stack exchange,提问作者JoGraf
相关产品推荐
相关产品推荐

