当只知道所需对象的字符串名称时,C#中的JsonConvert.DeserializeObject

时间:2016-08-12 12:12:44

标签: c# json reflection

假设有关文档的信息存储在条形码中,信息的结构根据文档的类型而有所不同。但事先并不知道文件的类型;条形码告诉我们我们正在处理什么样的文件:

条形码值不会存储这样的分隔字符串:

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语句。

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

4 个答案:

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

Assembly.GetType(string name)

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可以帮到你:只需获取类型名称,通过反射获取类型实例并将其放入泛型类型中。