NewtonSoft DeserializeObject <列表<类型名称>>服务器发送什么类型的我不知道

时间:2019-05-13 17:54:48

标签: c# json.net deserialization

我有类似的问题。

deserialize list of objects using json.net

通常,我们在下面确实喜欢反序列化对象列表。但就我而言,我无法对List<Category>进行硬编码,因为我不知道类型是什么。

JsonConvert.DeserializeObject<List<Category>>(response.dtosString)

json中将有一个属性,该属性将为我提供类型名称,以便我可以创建如下所示的类型

string typename = string.Format("{0}, ABC.EDF", myresponse.dtoType);
Type resultType = Type.GetType(typename);

现在我要使用下面的类似内容

JsonConvert.DeserializeObject<List<typename>>(myresponse.dtosString)

我在下面尝试了一下,但没有用,因为它说动态不能被转换并且需要显式的转换逻辑。

Deserializing an unknown type in JSON.NET

解决方案::感谢克里斯为我指出了正确的方向。

这就是我所做的

string typename = string.Format("{0}, ABC.EDF", myresponse.dtoType);
Type resultType = Type.GetType(typename);
var listType = typeof(List<>);
Type constructedListType = listType.MakeGenericType(resultType);
var myData = Newtonsoft.Json.JsonConvert.DeserializeObject(myresponse.dtosString, constructedListType); 

此后,我仅将myData提供给第三方库中的读取函数,该函数我无权访问并处理数据。

1 个答案:

答案 0 :(得分:1)

有一个接受Type对象的重载。要构造您的类型的列表,您需要执行以下操作:

var constructedListType = typeof(List<>).MakeGenericType(resultType);
var listType = Activator.CreateInstance(constructedListType);

然后,您只需要使用适当的反序列化重载即可:

var myList = JsonConvert.DeserializeObject(myresponse.dtosString, listType);

值得注意的是,myList的类型为Object,没有简单的方法可以对其进行强类型化。根据您需要执行的操作,这可能没问题,或者您可能需要使用dynamic才能进一步使用它。