我有一个json
var j = @"
[{"Name":"John","Age":27},
{"Name":"Mike","Age":30},
{"Name":"Eric","Age":21}
]";
和班级:
public class Worker
{
public string Name{set;get;}
public int Age{set;get;}
}
以及如何使用Newtonsoft.Json
反序列化:
List<Worker> videogames = JsonConvert.DeserializeObject<List<Worker>>(j);
但是,如果我不知道我想反序列化而只有一个类型,该怎么办?
var worker = new Worker();
Type myType = worker.GetType();
在这种情况下,我如何反序列化此json字符串?
答案 0 :(得分:6)
只需使用接受Type
的{{3}},传入构造的列表类型:
Type listType = typeof(List<>).MakeGenericType(myType);
object list = JsonConvert.DeserializeObject(json, listType);
当然,之后您将无法以静态类型安全的方式使用它-可能需要强制转换-但这是不可避免的,如果您尝试使用仅在执行时才知道的类型
答案 1 :(得分:0)
如果您知道要反序列化特定类型列表的对象,并且知道要使用的类型的名称,则可以使用泛型为您提供严格输入的内容。例如:
public static List<T> DeserializeJsonList<T>(string json)
{
return JsonConvert.DeserializeObject<List<T>>(json);
}
要使用类似这样的内容,您可以编写:
string myJson = "[json goes here]";
List<MyType> myList = DeserializeJsonList<MyType>(string json);
但是,如果类型是匿名的(您只有一个Type
对象实例,那么您将可能不得不求助于Jon Skeet的答案。
Koda