我正在处理从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>>();
编译器声明我使用变量作为类型。这是有道理的,但无法找到解决方法。
任何帮助将不胜感激!
答案 0 :(得分:0)
您可以动态访问JArray
,而不是反序列化var listType = typeof(List<>).MakeGenericType(classtype);
var records = array.ToObject(listType);
,而不是Querying JSON with dynamic中所示。但是,如果您希望反序列化为固定列表类型,因为您正在编写非泛型基于反射的代码,您可以这样做:
List<>
注意:
给定一个开放的泛型类型,例如Type
,Type.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
}
}
的定义。