当我不知道我使用什么类时,如何反序列化json数组?

时间:2018-11-15 08:48:52

标签: c# json

我有一个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字符串?

2 个答案:

答案 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