C#从JArray创建通用列表

时间:2017-09-22 18:43:47

标签: c# json generics

我正在处理从Json到对象数组的动态导入过程。 通过创建List<>来获得一点点卡住基于对类对象的字符串引用。

我从REST服务器导入json数据并使用业务对象列表将json数据映射到可配置的预定义类。我使用NewtonSoft.Json将数据解析为类。

string classname = "BusinessObjects.Contact";
Type classtype = Type.GetType(classname);
// ... filled jsonstring from api request
string json = "[]"; // json filled from rest request
JObject obj = JObject.Parse(json);
JArray array = (JArray)obj["contacts"];

// the issue part...
var records = array.ToObject<List<classtype>>();

编译器声明我使用变量作为类型。这是有道理的,但无法找到解决方法。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您可以动态访问JArray,而不是反序列化var listType = typeof(List<>).MakeGenericType(classtype); var records = array.ToObject(listType); ,而不是Querying JSON with dynamic中所示。但是,如果您希望反序列化为固定列表类型,因为您正在编写非泛型基于反射的代码,您可以这样做:

List<>

注意:

  • 给定一个开放的泛型类型,例如TypeType.MakeGenericType()通过用ToObject()参数替换open类型的类型参数来创建一个封闭的泛型类型。

  • JToken.ToObject()Type的非通用版本,可以反序列化为指定的records

  • 创建IList列表后,您可以将其投射到非通用BusinessObjects.Contact界面以访问集合项。

示例fiddle包含原型样本JSON和 var events = 0 private static void QueueRequestChanged() { events++; Task.Delay(10000).ContinueWith(t => Trigger()); } private static void Trigger() { if(events > 0) { events = 0; // do code here } } 的定义。