2016-08-12 113 views
2

假设有关文档的信息存储在条形码中,并且信息的结构根据文档的类型而不同。但是文件的类型事先是未知的;条形码告诉我们,什么样的文件,我们正在处理:JsonConvert.DeserializeObject在C#中只有所需对象的字符串名称已知

条码值不会存放分隔字符串是这样的:

author|date|subject 
author|date|subject|approvedby1;approvedby2 

但会包含JSON对象:

FOO|{"author": "Smokey", "date": "01/01/2015", "subject": "widgets"} 

GOO|{"author": "Smokey", "date": "01/01/2015", "subject": "widgets", "approvals": ["Mike","Jane"]} 

当我们获取条形码文本数据,我们从|定界符左侧的值中看到,我们需要实例化FOOGOO。我们抓住|右侧的字符串并将其送到JsonConvert

如何告诉JsonConvert.DeserializeObject<some type>从其json表示中返回一个GOO对象?

var myGoo = JsonConvert.DeserializeObject<?>(jsonStringGOO) 

尖括号之间的内容< >

编辑:理想情况下,不诉诸于switch语句。

我们假设当前命名空间包含所有可能类型的类定义。

回答

2

如何尝试使用反射

var data = input.Split('|'); 

var assembly = Assembly.LoadFrom("MyDll.dll"); 

var myType = assembly.GetType("My.Namespace." + data[0]); // GOO/BAR/etc 

JsonConvert.DeserializeObject(data[1], myType) 

Assembly.GetType(string name)

JsonConvert.DeserializeObject(string value, Type type)

注:获得组件的类型对于调试,你可以使用这样的代码得到类型的全名

var t = typeof(Goo); 
Debug.WriteLine(t.FullName); 
+0

我已经很少使用Reflection了,并且在Assembly.GetType行上得到一个错误,指出“非静态字段需要对象引用,方法,或者属性Assembly.GetType(string)'。必须实例化哪个反射对象? – Tim

+0

对不起 - 编辑 –

+0

谢谢。 “MyAssembly”后面的引号是否在内部或外部?我假设“+”。“ +'是吗? – Tim

0

假设你有一个名为GOO的类,呼叫的类型在括号之间。但是,你必须根据类型进行切换:

class GOO { 
    string author { get; set; } 
    string date { get; set; } 
    // ... 
} 

class FOO { 
    // ... 
} 

object parse(string barcode) { 
    int pos = barcode.IndexOf('|'); 
    string type = barcode.substring(0,pos); 
    string obj = barcode.substring(pos+1); 
    switch(type) { 
    case "GOO": return JsonConvert.DeserializeObject<GOO>(obj); 
    case "FOO": return JsonConvert.DeserializeObject<FOO>(obj); 
    default: return null; // unknown type 
    } 
} 
+0

有没有办法做到这一点没有switch语句?我将编辑我的问题。 – Tim

+0

您也可以使用反射按名称查询类型,并使用该类型信息构建泛型方法。这将工作,无需switch语句等,并可扩展而无需重新编译 – Charleh

-1

相信this可以帮助你:只要抓住类型名称,通过反射获取类型实例,并把它放到泛型类型。

0

你真的需要有不同的对象吗?

因为您可以使用具有所有可能属性的单个对象,并且未收到的属性将被填充,就像空白(或假)一样。

我试图添加一个List<string>财产的应用程序我有谁收到JSON和效果是该属性具有空值。

相关问题