假设有关文档的信息存储在条形码中,信息的结构根据文档的类型而有所不同。但事先并不知道文件的类型;条形码告诉我们我们正在处理什么样的文件:
条形码值不会存储这样的分隔字符串:
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"]}
当我们获取条形码文本数据时,我们会从|
分隔符的左侧看到我们需要实例化FOO
或GOO
。我们抓取|
右侧的字符串并将其提供给JsonConvert
。
如何告诉JsonConvert.DeserializeObject<some type>
从其json表示中返回GOO对象?
var myGoo = JsonConvert.DeserializeObject<?>(jsonStringGOO)
尖括号< >
之间的距离是什么?
编辑:理想情况下,不使用switch语句。
假设当前命名空间包含所有可能类型的类定义。
答案 0 :(得分: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)
JsonConvert.DeserializeObject(string value, Type type)
N.B。对于调试,您可以使用类似
的代码获取该类型的全名var t = typeof(Goo);
Debug.WriteLine(t.FullName);
答案 1 :(得分: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
}
}
答案 2 :(得分:-1)
你真的需要有不同的物品吗?
因为您可以使用具有所有可能属性的单个对象,并且将填充未接收的属性,就好像是空白(或错误)。
我尝试在我收到json的应用上添加List<string>
属性,效果是该属性的值为空。
答案 3 :(得分:-2)
我相信this可以帮到你:只需获取类型名称,通过反射获取类型实例并将其放入泛型类型中。